2013-08-24 22 views
85

Mam plik JSON tak:Korzystanie GSON do analizowania tablicę JSON

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

Przed gdy pliki miały element główny użyłbym:

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

kod ale nie mogę myśleć jak kodować klasę Wrapper jako element główny jest tablicą.

Próbowałem, używając:

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

z:

ale nie miał szczęścia. Jak inaczej mogę to przeczytać za pomocą tej metody?

P.S Mam to zadziałało, 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) z obu metod.

+2

Czy jesteś pewien, że jest przecinek po elementach tytuł? Jeśli usuniesz je 'Wrapper [] data = gson.fromJson (jElement, Wrapper []. Class);' działa dobrze dla mnie. – Pshemo

+0

To będzie problem ... taki prosty błąd! – Edd

Odpowiedz

88

Problem jest spowodowany przecinkiem po ostatnim elemencie tablicy (po każdym title). Jeśli go usunąć i zmienić swoje dane

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

Wrapper[] data = gson.fromJson(jElement, Wrapper[].class); będzie działać dobrze.

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

class Wrapper{ 
    int number; 
    String title;  
} 

Wydaje się działać poprawnie. Ale w twoim ciągu znajduje się dodatkowa przecinek ,.

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

próba połączenia:

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

Dla mnie to zamienia moje obiekty na listę LinkedTreeMap zamiast obiektów listy specyfikacji (na przykład). –

+0

Skąd wziąłeś klasę GsonUtils? –

+0

'' GsonUtils'' jest klasą, w której umieścił własną metodę '' toList() '. – user1438038