2013-05-23 18 views
7

Sto tentando di analizzare json su java.JSON Stringa su oggetto Java utilizzando GSON

Ho la seguente stringa che è valida JSON in base alle jsonlint.com

private final static String LOC_JSON = 
     "[" 
     +"{" 
     +" \"lat1\": 39.737567," 
     +" \"lat2\": 32.7801399," 
     +" \"long1\": -104.98471790000002," 
     +" \"long2\": -96.80045109999998" 
     +"}," 
     +" [" 
     +"  {" 
     +"   \"lat\": {" 
     +"    \"b\": 38.88368709500021," 
     +"    \"d\": 40.620468491667026" 
     +"   }," 
     +"   \"long\": {" 
     +"   \"b\": -105.75306170749764," 
     +"   \"d\": -104.675854661387" 
     +"   }" 
     +"  }" 
     +" ]" 
     +"]"; 

Sto cercando di analizzarlo in un oggetto e ottengo il seguente errore. "Ci aspettavamo BEGIN_OBJECT ma era BEGIN_ARRAY at line 1 colonna 2"

  Gson gson = new Gson(); 
     BoxSearch b = gson.fromJson(LOC_JSON, BoxSearch.class); 

BoxSearch è costituito da questo.

private Number lat1; 
private Number lat2; 
private Number long1; 
private Number long2; 
private Boxes[] boxes; 

Caselle è un oggetto Latitudine e un oggetto Longitudine che sono entrambi definiti identici.

private String b; 
private String d; 

posso analizzare gli attributi di livello superiore (LAT1, Lat2, long1 e long2) in un più semplice oggetto BoxSearch che ha solo quei 4 attributi. Il problema arriva quando il json e l'oggetto sono più complessi. È persino possibile fare ciò che sto provando?

Spero di aver fornito informazioni sufficienti per ottenere aiuto. Sarei felice di fornire ulteriori informazioni o anche un progetto di test, se necessario. Lo sto facendo come test di junit.

Grazie.

+3

possibile duplicato di [lancio di GSON "BEGIN atteso \ _OBJECT ma era BEGIN \ _ARRAY"?] (Http://stackoverflow.com/questions/9598707/gson-throwing-expected-begin-object-but-was-begin -array) - il tuo JSON è un array, non un oggetto. Avrai comunque un problema perché è un array contenente diversi tipi di oggetti (un oggetto e un array) che non puoi gestire senza scrivere un deserializzatore personalizzato. –

+0

@BrianRoach è più simile a una risposta;) –

+0

@RC. Si ... Hmm. Penso che forse lo sposterò, il vecchio Q risponde perché sta ricevendo l'errore, ma la risoluzione del suo caso è diversa –

risposta

16

Il motivo dell'errore è che il JSON al livello superiore è un array, non un oggetto. Questo è coperto da GSON throwing "Expected BEGIN_OBJECT but was BEGIN_ARRAY"?.

Tuttavia, la soluzione non funzionerà per il tuo JSON perché hai una matrice di tipi misti (un oggetto e un array) piuttosto che un array di un singolo tipo di oggetto. Per questo dovrai scrivere un deserializzatore personalizzato (vedi The section of the Gson user's guide that covers this) o utilizzare direttamente la classe JsonParser di Gson ed estrarre i dati dall'albero di analisi.

Modifica dal osservazioni di cui sopra:

Se tu sei quello di creare il JSON, è sembra come ciò che si vuole è un array di oggetti BoxSearch?

Sulla base della sua classe Java BoxSearch, avreste bisogno di JSON strutturato come:

[ 
    { 
     "lat1" : 39.737567, 
     "lat2" : 32.7801399, 
     "long1" : -104.98471790000002, 
     "long2" : -96.80045109999998, 
     "boxes" : [ 
        { 
         "lat": { 
          "b": 38.88368709500021, 
          "d": 40.620468491667026 
         }, 
         "long": { 
          "b": -105.75306170749764, 
          "d": -104.675854661387 
         } 
        } 
        ] 
    } 
] 

Tuttavia, il modo in cui avete Boxes classe definita non funziona per questo. (Intendevi avere una serie di loro?). As-Is avrebbe bisogno di apparire come:

class Boxes { 
    Box lat; 
    @SerializedName("long") 
    Box lon; 
} 

class Box { 
    String b; 
    String d; 
} 

Ora avete una matrice contenente un tipo di oggetto (BoxSearch), che si potrebbe deserializzare con:

Type collectionType = new TypeToken<Collection<BoxSearch>>(){}.getType(); 
Collection<BoxSearch> boxSearchCollection = gson.fromJson(json, collectionType); 

Se davvero non hanno bisogno una serie di questi, sbarazzarsi di matrice esterna e semplicemente fare:

gson.fromJson(json, BoxSearch.class); 
+0

Grazie mille Brian, quel piccolo ritocco a Json e tutto va bene. Voterò questa risposta ma non ho "credenziali". Il codice funziona come un campione. Nel caso in cui le persone copiano e incollino questa risposta, Box long; deve essere rinominato :-) – user2415153

+0

Oh e sì, avevo bisogno dell'array. Grazie ancora. – user2415153

+0

@ user2415153 Ho cambiato il codice in modo che funzioni con '" long "' nel JSON - guarda la risposta ora :) Non me ne sono accorto, mi dispiace. Per quanto riguarda l'upvoting, puoi accettare la mia risposta;) e felice di poterti aiutare! –

13
Gson gson = new Gson(); 
gson.fromJson(jsonStr,YourClass.class); 

molto facile.

+0

mi aiuta a convertire un oggetto JSON che ha una lista all'interno. Converto la stringa json in Object.class – Ashkan

Problemi correlati