Utilizzo di GSON per analizzare un array JSON


110

Ho un file JSON come questo:

[
    {
        "number": "3",
        "title": "hello_world",
    }, {
        "number": "2",
        "title": "hello_world",
    }
]

Prima di quando i file avevano un elemento radice, avrei usato:

Wrapper w = gson.fromJson(JSONSTRING, Wrapper.class);

codice ma non riesco a pensare a come codificare la Wrapperclasse poiché l'elemento radice è un array.

Ho provato a usare:

Wrapper[] wrapper = gson.fromJson(jsonLine, Wrapper[].class);

con:

public class Wrapper{

    String number;
    String title;

}

Ma non ho avuto fortuna. In quale altro modo posso leggerlo utilizzando questo metodo?

PS Devo farlo funzionare usando:

JsonArray entries = (JsonArray) new JsonParser().parse(jsonLine);
String title = ((JsonObject)entries.get(0)).get("title");

Ma preferirei sapere come farlo (se possibile) con entrambi i metodi.


4
Sei sicuro che ci sia una virgola dopo gli elementi del titolo? Se li rimuovi Wrapper[] data = gson.fromJson(jElement, Wrapper[].class);funziona bene per me.
Pshemo

1
Questo è il problema .. un errore così semplice!
Eduardo

Risposte:


112

Il problema è causato dalla virgola alla fine di (nel tuo caso ciascuno ) oggetto JSON inserito nell'array:

{
    "number": "...",
    "title": ".." ,  //<- see that comma?
}

Se li rimuovi i tuoi dati diventeranno

[
    {
        "number": "3",
        "title": "hello_world"
    }, {
        "number": "2",
        "title": "hello_world"
    }
]

e

Wrapper[] data = gson.fromJson(jElement, Wrapper[].class);

dovrebbe funzionare bene.



1
@Snake BTW, in caso di jacksonlibreria e questo commento, la creazione di array e il wrapping con Arrays.asList(..)è più veloce della creazione di un elenco utilizzando TypeRefence. Non l'ho testato con la gsonlibreria, ma potrebbe valere la pena confrontarlo.
Pshemo

39
Gson gson = new Gson();
Wrapper[] arr = gson.fromJson(str, Wrapper[].class);

class Wrapper{
    int number;
    String title;       
}

Sembra funzionare bene. Ma c'è una ,virgola in più nella tua stringa.

[
    { 
        "number" : "3",
        "title" : "hello_world"
    },
    { 
        "number" : "2",
        "title" : "hello_world"
    }
]

16
public static <T> List<T> toList(String json, Class<T> clazz) {
    if (null == json) {
        return null;
    }
    Gson gson = new Gson();
    return gson.fromJson(json, new TypeToken<T>(){}.getType());
}

chiamata di esempio:

List<Specifications> objects = GsonUtils.toList(products, Specifications.class);

4
Per me, questo sta trasformando i miei oggetti in un elenco di LinkedTreeMap invece che in un elenco di oggetti di specifica (ad esempio).
Ryan Newsom

Dove hai preso la lezione di GsonUtils?
rosu alin

GsonUtilsè la classe in cui ha messo il suo toList()metodo.
user1438038

Questo non può funzionare: il TypeToken deve creare un valore sbagliato poiché T non è noto quando viene compilato. Questo probabilmente creerà il token di tipo per List <Object>. Dovresti usare la classe effettiva quando crei il tipo.
Hans-Peter Störr

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.