Utilisation de GSON pour analyser un tableau JSON

110

J'ai un fichier JSON comme celui-ci:

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

Avant, lorsque les fichiers avaient un élément racine, j'utilisais:

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

code mais je ne peux pas penser comment coder la Wrapperclasse car l'élément racine est un tableau.

J'ai essayé d'utiliser:

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

avec:

public class Wrapper{

    String number;
    String title;

}

Mais je n'ai pas eu de chance. Sinon, comment puis-je lire ceci en utilisant cette méthode?

PS, je l'ai fait fonctionner en utilisant:

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

Mais je préférerais savoir comment le faire (si possible) avec les deux méthodes.

Eduardo
la source
4
Êtes-vous sûr qu'il y a une virgule après les éléments de titre? Si vous les supprimez, cela Wrapper[] data = gson.fromJson(jElement, Wrapper[].class);fonctionne très bien pour moi.
Pshemo
1
Voilà le problème… une erreur si simple!
Eduardo

Réponses:

112

Le problème est causé par une virgule à la fin de (dans votre cas chaque ) objet JSON placé dans le tableau:

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

Si vous les supprimez, vos données deviendront

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

et

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

devrait bien fonctionner.

Pshemo
la source
1
@Snake BTW, en cas de jacksonbibliothèque et de ce commentaire, créer un tableau et l'envelopper Arrays.asList(..)est plus rapide que de créer une liste à l'aide de TypeRefence. Je ne l'ai pas testé avec une gsonbibliothèque, mais cela vaut peut-être la peine de le comparer.
Pshemo
39
Gson gson = new Gson();
Wrapper[] arr = gson.fromJson(str, Wrapper[].class);

class Wrapper{
    int number;
    String title;       
}

Semble bien fonctionner. Mais il y a une ,virgule supplémentaire dans votre chaîne.

[
    { 
        "number" : "3",
        "title" : "hello_world"
    },
    { 
        "number" : "2",
        "title" : "hello_world"
    }
]
Narendra Pathai
la source
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());
}

exemple d'appel:

List<Specifications> objects = GsonUtils.toList(products, Specifications.class);
chenyueling
la source
4
Pour moi, cela transforme mes objets en une liste de LinkedTreeMap au lieu d'une liste d'objets de spécification (par exemple).
Ryan Newsom
Où avez-vous obtenu la classe GsonUtils?
rosu alin
GsonUtilsest la classe où il a mis sa propre toList()méthode.
user1438038
Cela ne peut pas fonctionner: le TypeToken doit créer une valeur erronée car T n'est pas connu lors de la compilation. Cela créera probablement le jeton de type pour List <Object>. Vous devrez utiliser la classe réelle lors de la création du type.
Hans-Peter Störr le
1
Wrapper[] data = gson.fromJson(jElement, Wrapper[].class);
shahzeb khan
la source