2013-05-16 12 views
20

Ho il seguente JSON e sono interessato solo a ottenere gli elementi "status", "lat" e "lng".Analisi GSON senza molte classi

Utilizzo di Gson, è possibile analizzare questo JSON per ottenere quei valori senza creare l'intera struttura di classi che rappresenta il contenuto JSON?

JSON:

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

Il tuo JSON non è valido (puoi verificarlo con [jsonlint] (http://jsonlint.com). La proprietà inner 'geometry' di' address_components' deve essere racchiusa in un oggetto (usando le parentesi '{}') – Perception

+0

Ho tagliato un sacco di nodi inutili e si è verificato un errore di battitura :-) – Reeebuuk

+0

Quindi, qual è il modulo corretto? Non posso davvero proporre una soluzione rapida senza saperlo. – Perception

risposta

32

Non hai bisogno di definire nuove classi, puoi semplicemente usare JSON oggetti forniti con la libreria Gson. Ecco un semplice esempio:

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

Semplice e semplice. Se ti ritrovi a ripetere lo stesso codice più e più volte, puoi creare classi per semplificare la mappatura ed eliminare la ripetizione.

+0

Buona soluzione senza deserializzatore personalizzato! Comunque penso che questo approccio sia molto più difficile da mantenere e riutilizzare ... non pensi che sia meglio e più elegante il solito parsing usando le classi? – MikO

+0

C'è qualche differenza di prestazioni tra la tua soluzione e quella di MikOs? – Reeebuuk

+1

Per dati di input così piccoli il miglioramento delle prestazioni sarà trascurabile. Per i set di dati più grandi c'è un po 'di tempo risparmiato nella gestione del POJO (extra) mappato. Ma tieni presente che l'utilizzo di un metodo rispetto all'altro dovrebbe essere guidato da molto più di qualsiasi guadagno percepito nelle prestazioni (ad esempio, la complessità dei dati in entrata potrebbe rendere inutilmente noiosa la creazione di una classe di mappatura). – Perception

5

è infatti possibile, ma è necessario creare un personalizzato deserializzatore. Consultare la documentazione Gson here e Gson API Javadoc here per ulteriori informazioni. E anche dare un'occhiata ad altre mie risposte here e here ... e se avete ancora dubbi, commentare.

Detto questo, a mio parere è molto più facile per te analizzarlo creando le classi corrispondenti, tenendo ancora più in considerazione la semplicità della tua risposta JSON ... Con il solito approccio devi solo scrivere alcuni super- classi semplici, tuttavia, scrivendo un deserializzatore personalizzato, anche se non è così complesso, ci vorrà probabilmente più tempo, e sarà più difficile adattarsi se in seguito hai bisogno di alcuni dati del tuo JSON ...

Gson ha un modo di operare che è stato progettato per gli sviluppatori di usarlo, non per cercare di trovare soluzioni alternative!

In ogni caso, perché non vuoi usare le lezioni? Se non ti piace avere molte classi nel tuo progetto, puoi semplicemente usare classi annidate e il tuo progetto apparirà più pulito ...

+0

Quando lo dici così, sono d'accordo con te. Cercherò di generare tutte le classi e rispondere qui ci saranno alcuni problemi. – Reeebuuk

+0

Basta deserializzare su JsonObject, nel tuo caso è quello che stai cercando – eugen

+0

Fatto, fatto un po 'nidificato e tutto funziona perfettamente. Grazie a tutti :-) – Reeebuuk

Problemi correlati