2012-12-06 10 views
6

Wiem, że istnieje wiele pytań JSON z pytaniami GSON, ale żaden z nich nie odnosi się bezpośrednio do mnie. Mój JSON jest sformatowany inaczej.Używanie Gson do parsowania tablicy Json i obiektu bez nazwy

Mam danych JSON chcę analizować stosując GSON który wygląda następująco:

[ 
    { 
    "foo":"1", 
    "bar":[ { "_id":"bar1"} ], 
    "too":["mall", "park"] 
    } 
] 

i mam modelu klasy:

tablicy ItemArray klasy

public class ItemArray 
{ 
    List<Item> itemArray; 

    //Get set here 
} 

Przedmiot Klasa

public class Item 
{ 
    String foo; 
    List<Bar> bar; 
    List<String> too; 

    //Get set here 
} 

Bar Klasa

public class Bar 
{ 
    String id; 

    //Get set here 
} 

Herezje pytanie. Czy JSON ma poprawny format? Jeśli tak, czy klasy modelu są w prawidłowym formacie?

Jeśli nie, proszę popchnąć mnie we właściwym kierunku. Z góry dziękuję!

PS. W razie potrzeby mogę zmodyfikować format danych JSON.

Odpowiedz

6

Według twojej json, należy po prostu:

public class ItemArray extends List<Item> { 
} 

jeśli chcesz zachować ci java klasę i zmienić json powinno być:

{ 
itemArray: [ 
    { 
     "foo":"1", 
     "bar":[ { "_id":"bar1"} ], 
     "too":["mall", "park"] 
    } 
    ] 
} 

Aha, i jest tam niedopasowanie z identyfikatorem i _id dla paska:

public class Bar 
{ 
    String _id; 

    //Get set here 
} 

Możesz także użyć adnotacji, aby zmienić pole imię podczas Json de/serializacji.

I na koniec, pomyśl nad poprawianiem swoich wartości. Nie widzę żadnych danych jako ciągów, jeśli nie są, nie będzie dużo przetwarzania w kodzie java, aby konwertować rzeczy. Na przykład:

"foo" : 1, 

i zobacz foo jako członka danych int, a nie ciąg.

+0

czyli innymi słowy, potrzebuję tylko jednej klasy ItemArray + th e Przedmiot klasy oczywiście BEZ zmiany mojego formatu JSON? –

+0

Myślę, że tak, tak. I zmiana paska z identyfikatora na _id. – Snicolas

+0

ok lemme wypróbuj go –

0

Aby sprawdzić JSON jest ważny wykorzystanie tego narzędzia http://jsonlint.com/

Class Bar(
    private String _id; 
    //create getter/setters 
{ 

public class Item 
{ 
    String foo; 
    List<Bar> bar; 
    List<String> too; 

    //Get set here 
} 
//this is also fine 
public class ItemList 
{ 
    List<Item> itemArray; 

    //Get set here 
} 

ty nazwie z listy pozycji „tablicy ItemArray”, ale w json nie nazwali odpowiednią tablicę elementów „tablicy ItemArray”. Zrób więc itemArray, problem nie występuje w twoim jsonie, jest ważny. Problem polega na tym, że Gson, Gson klucze map json na zmiennych obiektu (tj. Java POJO) o tej samej nazwie. Jeśli nazwa twojej liście jest klasa jest

List<Item> itemArray; 

następnie odpowiednia nazwa tablicy json powinny być również tablicy ItemArray, wziąć cios wygląd

{ 
itemArray: [ 
    { 
     "foo":"1", 
     "bar":[ { "_id":"bar1"} ], 
     "too":["mall", "park"] 
    } 
    ] 
} 

więc można przekonwertować json do obiektu jak ten

Reader reader = new InputStreamReader(IOUtils.toInputStream(json_string)); 
ItemList itemList = json.toObject(reader, ItemList.class); 

Spójrz w odniesieniu ciosem dla więcej szczegółów https://stackoverflow.com/questions/13625206/how-to-parse-the-result-in-java/13625567#13625567

+0

pierwsza odpowiedź odpowiedziała na moje pytanie. ale dziękuję ci za odpowiedź i wgląd. Będę o tym pamiętać w przyszłości: D –

+0

Co jeśli nie mogę zmienić formatu json. To jest, jak ustawić model, jeśli nie jestem w stanie dodać "itemArray" w jsonie? Dzięki. –

4

Czasami otrzymujemy JsonArray [ {..} , {..} ] jako odpowiedź (bez 'itemArray' nazwie jak Twoja) W takim przypadku można użyć następującego kodu

Type fooType = new TypeToken<ArrayList<Item>>() {}.getType(); 
List<Item> array = new Gson().fromJson(response, fooType); 

dowiedzieć się więcej o tym Official doc - Gson Array-Examples

2

Jeśli masz JsonArray jak [ {..} , {..} ] możesz to zrobić z Gson:

Item[] items = gson.fromJson(json, Item[].class); 
+0

jak to parsować dalej ... tj dostępu String w Item.class? –

Powiązane problemy