2013-05-16 10 views
20

Mam następujące JSON i interesuję się tylko uzyskiwaniem elementów "status", i "lng".Przetwarzanie GSON bez wielu klas

Korzystanie z Gson, czy można przeanalizować ten JSON, aby uzyskać te wartości bez tworzenia całej struktury klas reprezentującej zawartość JSON?

JSON:

{ 
    "result": { 
    "geometry": { 
     "location": { 
     "lat": 45.80355369999999, 
     "lng": 15.9363229 
     } 
    } 
    }, 
    "status": "OK" 
} 
+2

Twój JSON jest nieprawidłowy (możesz go zweryfikować za pomocą [jsonlint] (http://jsonlint.com) Wewnętrzna właściwość 'geometry'' address_components' powinna być owinięta w obiekt (używając nawiasów klamrowych '{}') – Perception

+0

Wyciąłem wiele niepotrzebnych węzłów i wystąpiła literówka :-) – Reeebuuk

+0

Jaka jest poprawna forma? Naprawdę nie mogę zaproponować szybkiego rozwiązania, nie wiedząc o tym. – Perception

Odpowiedz

32

Nie musisz definiować żadnych nowych klas, możesz po prostu użyć JSON obiekty dołączone do biblioteki Gson. Oto prosty przykład:

JsonParser parser = new JsonParser(); 
JsonObject rootObj = parser.parse(json).getAsJsonObject(); 
JsonObject locObj = rootObj.getAsJsonObject("result") 
    .getAsJsonObject("geometry").getAsJsonObject("location"); 

String status = rootObj.get("status").getAsString(); 
String lat = locObj.get("lat").getAsString(); 
String lng = locObj.get("lng").getAsString(); 

System.out.printf("Status: %s, Latitude: %s, Longitude: %s\n", status, 
     lat, lng); 

Zwykły i prosty. Jeśli powtarzasz powtarzanie tego samego kodu w kółko, możesz tworzyć klasy, aby uprościć mapowanie i wyeliminować powtarzanie.

+0

Dobre rozwiązanie bez niestandardowego deserializera! W każdym razie myślę, że to podejście jest o wiele trudniejsze w utrzymaniu i ponownym użyciu ... czy uważasz, że nie jest ono lepsze i bardziej eleganckie niż zwykłe przetwarzanie przy użyciu klas? – MikO

+0

Czy istnieje różnica w wydajności między rozwiązaniem Yours a MikOs? – Reeebuuk

+1

Dla tak małych danych wejściowych poprawa wydajności będzie znikoma. W przypadku większych zestawów danych zaoszczędzono trochę czasu na zarządzaniu (dodatkowym) odwzorowanym POJO. Należy jednak pamiętać, że używanie jednej metody nad drugą powinno być sterowane znacznie więcej niż jakiekolwiek dostrzegalne zyski w wydajności (na przykład złożoność przychodzących danych może niepotrzebnie nużyć tworzenia klasy odwzorowania). – Perception

5

To jest rzeczywiście możliwe, ale trzeba stworzyć zwyczaj Deserializator. Aby uzyskać więcej informacji, zobacz dokumentację Gson here i Gson API Javadoc here. A także spójrz na inne odpowiedzi mojej kopulacji here i here ... a jeśli nadal masz wątpliwości, komentarz.

To powiedziawszy, moim zdaniem znacznie łatwiej jest je przeanalizować, tworząc klasy korespondentowe, tym bardziej biorąc pod uwagę prostotę odpowiedzi JSON ... Przy zwykłym podejściu wystarczy napisać superumiejętność. proste klasy, jednak pisanie niestandardowego deserializatora, chociaż nie jest tak skomplikowane, zajmie ci prawdopodobnie dłużej, i będzie trudniej dostosować, jeśli później potrzebujesz więcej danych swojego JSON ...

Gson ma sposób działania, który został zaprojektowany dla programistów, aby z niego korzystać, a nie do próby obejścia tego problemu!

W każdym razie, dlaczego nie chcesz używać zajęć? Jeśli nie chcesz mieć wielu klas w swoim projekcie, możesz po prostu użyć klas zagnieżdżonych, a twój projekt będzie wyglądał czysto ...

+0

Kiedy mówisz tak, zgadzam się z tobą. Spróbuję wygenerować wszystkie klasy i odpowiedzieć, że będą problemy. – Reeebuuk

+0

Wystarczy deserialize do JsonObject zamiast tego, w twoim przypadku to jest to, czego szukasz – eugen

+0

Zrobione, wykonane kilka zagnieżdżonych sklasyfikowane i wszystko działa dobrze. Thx do wszystkich :-) – Reeebuuk

Powiązane problemy