2012-02-25 9 views
6

sto ottenendo i dati JSON da un servizio Web, i dati di esempio è il seguente:errore JSON Android "BEGIN_OBJECT aspettavamo ma era BEGIN_ARRAY at line 1 colonna 2"

[ 
    { 
    "SectionId": 1, 
    "SectionName": "Android" 
    } 
] 

Quando provo a convertirlo, è genera un errore, lo faccio come:

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

mia sezione Classe è:

class Section 
{ 
    public int SectionId; 
    public String SectionName; 
} 

class Data { 
    public List<Section> sections; 
} 

Il LogCat dice:

com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: BEGIN_OBJECT aspettavamo ma era BEGIN_ARRAY at line 1 colonna 2

risposta

6

L'errore spiega che cosa è sbagliato .. . ur che restituisce un array e non un oggetto JSON

prova come segue:

JSONArray ja = new JSONArray(jsonStringReturnedByService); 

Data sections = new Data(); 

for (int i = 0; i < ja.length(); i++) { 
    Section s = new Section(); 
    JSONObject jsonSection = ja.getJSONObject(i); 

    s.SectionId = Integer.ValueOf(jsonSection.getString("SectionId")); 
    s.SectionName = jsonSection.getString("SectionName"); 

    //add it to sections list 
    sections.add(s); 
} 

return sections; 
+0

Great thanks ha funzionato per me! –

+2

Questa è una cattiva risposta. Cambiare il modo in cui l'API restituisce i dati non è sempre un'opzione. – Prem

8

Stai provando a creare un oggetto non-Array (Collection) da un JSONArray. L'errore è abbastanza chiaro: GSON si aspettava l'inizio di un oggetto, ma invece ha trovato l'inizio di un array.

Date un'occhiata alla pagina di documentazione di seguito per vedere come lavorare con i tipi di array e Collezione con GSON

https://sites.google.com/site/gson/gson-user-guide#TOC-Collections-Examples

Dalla documentazione:

Esempi di array

GSON gson = new Gson(); int [] ints = {1, 2, 3, 4, 5}; String [] stringhe = {"abc", "def", "ghi"};

(serializzazione) gson.toJson (ints); ==> stampa [1,2,3,4,5] gson.toJson (stringhe); ==> stampa ["abc", "def", "ghi"]

(Deserializzazione) int [] ints2 = gson.fromJson ("[1,2,3,4,5]", int [] ].classe); ==> ints2 sarà uguale interi

Sosteniamo anche array multidimensionali, con arbitrariamente complessi tipi di elementi Collections Esempi

GSON GSON = new GSON(); Collection ints = Lists.immutableList (1,2,3,4,5);

(Serializzazione) String json = gson.toJson (ints); ==> json is [1,2,3,4,5]

(Deserializzazione) Tipo collectionType = new TypeToken>() {}. getType(); Collezione ints2 = gson.fromJson (json, collectionType); ints2 è uguale a int

Abbastanza orribile: notare come definire il tipo di raccolta Purtroppo, non c'è modo per aggirare questo in Java

Collezioni Limitazioni

possibile serializzare collezione di oggetti arbitrari, ma non può deserializzare perché non è possibile per l'utente indicare il tipo di oggetto durante la deserializzazione, la raccolta deve essere di tipo generico specifico Tutto ciò ha senso, e raramente è un problema w> dopo aver seguito bene Pratiche di codifica Java

+0

Grazie mille per la spiegazione! –

0

Usa classe sezione solo come segue:

Section[] sectionArray = new Gson().fromJson(jsonDataFromWebService, Section[].class); 
for (Section section: sectionArray) { 
    Log.e("Debug", section.toString()); 
} 
+0

Sebbene questo codice possa rispondere alla domanda, fornire un contesto aggiuntivo su come e/o perché risolve il problema migliorerebbe il valore a lungo termine della risposta. – Badacadabra

Problemi correlati