Verwenden von GSON zum Parsen eines JSON-Arrays

110

Ich habe eine JSON-Datei wie diese:

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

Früher, wenn Dateien ein Root-Element hatten, würde ich verwenden:

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

Code, aber ich kann mir nicht vorstellen, wie man die WrapperKlasse codiert, da das Stammelement ein Array ist.

Ich habe versucht:

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

mit:

public class Wrapper{

    String number;
    String title;

}

Aber ich hatte kein Glück. Wie kann ich das sonst mit dieser Methode lesen?

PS Ich habe dies zum Arbeiten mit:

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

Aber ich würde es vorziehen zu wissen, wie man es (wenn möglich) mit beiden Methoden macht.

Eduardo
quelle
4
Sind Sie sicher, dass nach den Titelelementen ein Komma steht? Wenn Sie sie entfernen, Wrapper[] data = gson.fromJson(jElement, Wrapper[].class);funktioniert es gut für mich.
Pshemo
1
Das ist das Problem ... so ein einfacher Fehler!
Eduardo

Antworten:

112

Das Problem wird durch ein Komma am Ende (in Ihrem Fall jeweils ) des im Array platzierten JSON-Objekts verursacht:

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

Wenn Sie sie entfernen, werden Ihre Daten

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

und

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

sollte gut funktionieren.

Pshemo
quelle
1
@Snake BTW, im Falle einer jacksonBibliothek und dieses Kommentars ist das Erstellen und Arrays.asList(..)Umschließen eines Arrays schneller als das Erstellen einer Liste mit TypeRefence. Ich habe es nicht mit der gsonBibliothek getestet, aber es kann sich lohnen, es zu vergleichen.
Pshemo
39
Gson gson = new Gson();
Wrapper[] arr = gson.fromJson(str, Wrapper[].class);

class Wrapper{
    int number;
    String title;       
}

Scheint gut zu funktionieren. ,In Ihrer Zeichenfolge befindet sich jedoch ein zusätzliches Komma.

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

Beispielaufruf:

List<Specifications> objects = GsonUtils.toList(products, Specifications.class);
Chenyueling
quelle
4
Für mich bedeutet dies, dass meine Objekte in eine Liste von LinkedTreeMap anstatt in eine Liste von Spezifikationsobjekten (zum Beispiel) umgewandelt werden.
Ryan Newsom
Woher hast du die GsonUtils-Klasse?
Rosu Alin
GsonUtilsist die Klasse, in der er seine eigene toList()Methode einsetzt.
user1438038
Dies kann nicht funktionieren: Das TypeToken muss einen falschen Wert erstellen, da T beim Kompilieren nicht bekannt ist. Dadurch wird wahrscheinlich das Typ-Token für List <Object> erstellt. Sie müssten die tatsächliche Klasse verwenden, wenn Sie den Typ erstellen.
Hans-Peter Störr
1
Wrapper[] data = gson.fromJson(jElement, Wrapper[].class);
shahzeb khan
quelle