2010-08-05 7 views
5

Totenstille! Nicht oft erlebt man das auf Stackoverflow ... Ich habe ein kleines Bounty hinzugefügt, um die Dinge in Gang zu bringen!Wie ändere ich eine große JSON-Zeichenfolge?

Ich habe ein JSON-Dokument mit Informationen über den Standort verschiedener Länder erstellt. Ich habe einige benutzerdefinierte Schlüssel hinzugefügt. Dies ist der Beginn der json-Datei:

{ 
    "type": "FeatureCollection", 
    "features": [ 
     { "type": "Feature", "properties": { 
      "NAME": "Antigua and Barbuda", 
      "banned/censored": "AG", 
      "Bombed": 29, 
      "LON": -61.783000, "LAT": 17.078000 }, 
    "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -61.686668,... 

Alle benutzerdefinierte Schlüssel (wie bombardiert, verboten/zensiert etc.) haben Werte, aber sie sind nur alt (Schein- wenn Sie möchten) Werte. Die tatsächlichen Werte werden in einer CSV-Datei gespeichert, die aus einem Excel-Dokument extrahiert wurde.

I z.B. have this:

      banned/censored  bombed 
Antigua and Barbuda    2     120 
... 

Jetzt möchte ich diese Werte mit dem richtigen Schlüssel in der JSON-Datei übereinstimmen. Gibt es irgendwelche Programme, die ich benutzen kann? Eine andere Option wäre eine json-Bibliothek für Java, die irgendwie unterstützt, was ich will. Ich habe noch keine einfache Lösung dafür gefunden. Das Dokument ist ziemlich groß ~ 10 MB, wenn es einen Unterschied macht!

EDIT: Ich habe QGIS verwendet, um die .shp-Datei zu manipulieren, so könnte eine Art von Erweiterung auch von Nutzen sein.

Antwort

7

Konvertieren Sie einfach sowohl die JSON als auch die CSV in ein fullworthy Java-Objekt. Auf diese Weise können Sie nach Belieben Java-Logik schreiben, um die Java-Objekte je nach dem zu ändern. Konvertieren Sie schließlich das geänderte Java-Objekt, das die JSON-Daten darstellt, zurück in eine JSON-Zeichenfolge.

Es gibt jedoch ein Problem in Ihrem JSON. Die / in banned/censored ist kein gültiges Zeichen für einen JSON-Feldname, so viele der vorhandenen JSON-Deserializer können daran ersticken. Wenn Sie das Problem beheben, können Sie eines davon verwenden.

Ich kann Google Gson für die Konvertierung zwischen JSON und Java empfehlen. Hier ist ein Kick-off Beispiel auf der Grundlage Ihrer JSON-Struktur (mit banned/censored-bannedOrCensored umbenannt):

class Data { 
    private String type; 
    private List<Feature> features; 
} 

class Feature { 
    private String type; 
    private Properties properties; 
    private Geometry geometry; 
} 

class Properties { 
    private String NAME; 
    private String bannedOrCensored; 
    private Integer Bombed; 
    private Double LON; 
    private Double LAT; 
} 

class Geometry { 
    private String type; 
    private Double[][][][] coordinates; 
} 

Sie müssen nur hinzufügen/generieren Getter und Setter selbst. Dann werden Sie in der Lage zu konvertieren zwischen JSON und Java wie folgt:

Data data = new Gson().fromJson(jsonString, Data.class); 

zwischen CSV und einem Java-Objekt zu konvertieren, nur eine der vielen CSV-Parser wählen, wie OpenCSV. Sie können sogar Ihr eigenes mit Hilfe von BufferedReader erstellen.

Schließlich, nachdem das Java-Objekt Änderung der JSON-Daten darstellen, können Sie es zu JSON-String mit Hilfe von Gson konvertieren zurück wie folgt:

String json = new Gson().toJson(data); 
+0

Das war, was ich zu vermeiden hoffte. Wie auch immer, ich werde es versuchen. Vielen Dank! –

+0

Was hatten Sie vor? Etwas Magie? – BalusC

+2

Ein Programm, das einige der Funktionen unterstützt, nach denen ich suche. Wie eine Erweiterung von QGIS oder was auch immer - wie Magie. Wie auch immer, Sie haben die Dinge laufen. –

3

Während BalusC Antwort sagt Ihnen, wie es in der aktuellen zu tun Setup, ich habe einen radikaleren Vorschlag: JSON loswerden.

Mit Idee JSON ist nicht zum Speichern von Daten gedacht - es soll als ein "leichter textbasierter offener Standard für den menschenlesbaren Datenaustausch" verwendet werden.Das heißt:

  • Low-Traffic (so wenig nicht aussagekräftige Daten wie möglich)
  • Menschen lesbaren
  • leicht mit dynamischen Sprachen zu handhaben

Datenspeicher auf der anderen Seite haben viel mehr Anforderungen als das. Deshalb existieren Datenbanken. Also verschiebe deinen Speicher in eine Datenbank. Wenn Sie keine vollständige Datenbank wünschen, verwenden Sie etwas wie HSQLDB oder JavaDB.

+0

Sie haben Recht. Ich mag JSON selbst nicht für die Datenspeicherung. Aber während ich mit OpenLayers und .shp-Dateien arbeitete, dachte ich, dass es das am einfachsten zu verwendende Format ist, da OpenLayers Geojson verwendet, und .shp-Dateien können durch gdal in geojson konvertiert werden. –