Używanie GSON do analizowania tablicy JSON

110

Mam taki plik JSON:

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

Wcześniej, gdy pliki miały element główny, używałbym:

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

kodu, ale nie mogę myśleć, jak zakodować Wrapperklasę, ponieważ element główny to tablica.

Próbowałem użyć:

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

z:

public class Wrapper{

    String number;
    String title;

}

Ale nie miałem szczęścia. Jak inaczej mogę to przeczytać przy użyciu tej metody?

PS Mam to do pracy używając:

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

Ale wolałbym wiedzieć, jak to zrobić (jeśli to możliwe) za pomocą obu metod.

Eduardo
źródło
4
Czy na pewno po elementach tytułu znajduje się przecinek? Jeśli je usuniesz, Wrapper[] data = gson.fromJson(jElement, Wrapper[].class);działa dobrze dla mnie.
Pshemo
1
To będzie problem… taki prosty błąd!
Eduardo

Odpowiedzi:

112

Problem jest spowodowany przecinkiem na końcu (w Twoim przypadku każdego ) obiektu JSON umieszczonego w tablicy:

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

Jeśli je usuniesz, Twoje dane staną się

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

i

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

powinno działać dobrze.

Pshemo
źródło
1
@Snake BTW, w przypadku jacksonbiblioteki i tego komentarza tworzenie tablicy i zawijanie jej Arrays.asList(..)jest szybsze niż tworzenie listy za pomocą TypeRefence. Nie testowałem tego z gsonbiblioteką, ale może warto to porównać.
Pshemo
39
Gson gson = new Gson();
Wrapper[] arr = gson.fromJson(str, Wrapper[].class);

class Wrapper{
    int number;
    String title;       
}

Wydaje się, że działa dobrze. Ale ,w twoim ciągu jest dodatkowy przecinek.

[
    { 
        "number" : "3",
        "title" : "hello_world"
    },
    { 
        "number" : "2",
        "title" : "hello_world"
    }
]
Narendra Pathai
źródło
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());
}

przykładowe wezwanie:

List<Specifications> objects = GsonUtils.toList(products, Specifications.class);
chenyueling
źródło
4
Dla mnie oznacza to przekształcenie moich obiektów w List of LinkedTreeMap zamiast w List of Specification obiektów (na przykład).
Ryan Newsom
Skąd masz klasę GsonUtils?
rosu alin
GsonUtilsto klasa, w której umieścił swoją własną toList()metodę.
user1438038
To nie może działać: TypeToken musi utworzyć nieprawidłową wartość, ponieważ T nie jest znana, gdy jest kompilowana. To prawdopodobnie utworzy token typu dla List <Object>. Podczas tworzenia typu musiałbyś użyć rzeczywistej klasy.
Hans-Peter Störr
1
Wrapper[] data = gson.fromJson(jElement, Wrapper[].class);
shahzeb khan
źródło