2010-08-05 14 views
5

Martwa cisza! Nieczęsto zdarza się to na Stackoverflow ... Dodałem małą nagrodę, aby wszystko przebiegło!Jak zmodyfikować duży ciąg znaków json?

Zbudowałem dokument json zawierający informacje o lokalizacji różnych krajów. Dodałem kilka niestandardowych kluczy. Jest to początek JSON pliku:

{ 
    "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,... 

Wszystkie klucze niestandardowych (jak zbombardowany, zakazane/ocenzurowane itp) mają wartości, ale są po prostu stary (podrobiony jeśli chcesz) wartości. Prawdziwe wartości są przechowywane w pliku .csv wyodrębnionym z dokumentu programu Excel.

Ja np. Mam to:

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

Teraz chcę dopasować te wartości do właściwego klucza w pliku json. Czy są jakieś programy, z których mogę skorzystać? Inną opcją jest biblioteka json dla java, która w jakiś sposób obsługuje to, co chcę. Nie udało mi się jeszcze znaleźć łatwego rozwiązania. Dokument jest dość duży ~ 10 MB, jeśli robi różnicę!

EDYCJA: Użyłem QGIS do manipulowania plikiem .shp, więc może być również przydatne pewne rozszerzenie.

Odpowiedz

7

Po prostu przekonwertuj zarówno JSON, jak i CSV na pełnowartościowy obiekt Java. W ten sposób możesz napisać dowolną logikę Java do swojego gustu, aby zmienić obiekty Java w zależności od tego czy innego. Na koniec skonwertuj zmodyfikowany obiekt Java reprezentujący dane JSON z powrotem na ciąg JSON.

Jest jednak jeden problem w twoim JSON. Wartość / w banned/censored nie jest poprawnym znakiem dla nazwy pola JSON, więc wiele istniejących deserializatorów JSON może się z tym nie dusić. Jeśli to naprawisz, będziesz mógł użyć jednego z nich.

Polecam przy użyciu Google Gson do konwersji między JSON i Java. Oto przykład kickoff w oparciu o struktury JSON (z banned/censored przemianowany na bannedOrCensored):

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; 
} 

Wystarczy dodać/generowania pobierające i ustawiające się. Wtedy będziesz w stanie konwertować między JSON i Java jak następuje:

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

do konwersji CSV i obiektu Java, wystarczy wybrać jedną z wielu analizatorów CSV, jak OpenCSV. Możesz nawet spersonalizować własny przy pomocy BufferedReader.

Wreszcie, po zmianie obiektu Java reprezentujący dane JSON, można przekonwertować go z powrotem do JSON ciąg znaków z pomocą Gson następująco:

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

Tego właśnie miałem uniknąć. W każdym razie spróbuję. Dzięki! –

+0

Co masz na myśli? Jakaś magia? – BalusC

+2

Program, który obsługuje niektóre funkcje, których szukam. Jak rozszerzenie QGIS, czy coś w tym rodzaju - jak magia. W każdym razie wszystko się zaczęło. –

3

Chociaż odpowiedź BalusC opowiada Ci jak to zrobić w bieżącym setup, mam bardziej radykalną sugestię: pozbyć się JSON.

Według pomysłu JSON nie jest przeznaczony do przechowywania danych - jest przeznaczony do użycia jako "lekki otwarty otwarty standard tekstowy przeznaczony do odczytu danych przez człowieka".Czyli:

  • niewielki ruch (jak mało non-sensowne dane jak to możliwe)
  • czytelny dla człowieka
  • łatwe w obsłudze z dynamicznych języków

przechowywania danych, z drugiej strony mają znacznie więcej wymagań niż to. Właśnie dlatego istnieją bazy danych. Przenieś magazyn do bazy danych. Jeśli nie chcesz pełnej bazy danych, użyj czegoś takiego jak HSQLDB lub JavaDB.

+0

Masz rację. Sam nie lubię JSON-a do przechowywania danych. Ale podczas pracy z plikami OpenLayers i .shp uznałem, że jest to najłatwiejszy w użyciu format, ponieważ OpenLayers używa geojsona, a pliki .shp można konwertować na geojsona przez gdal. –

Powiązane problemy