2010-09-21 16 views
50

Próbuję użyć Gson deserializacji json ciąg zwrócony z mojego usługaGson i deserializacji tablicę obiektów z tablicami w nim

Struktura byłyby zwracane jako TypeDTO[].

gdzie TypeDTO jest jak

int id; 
String name; 
ArrayList<ItemDTO> items[] 

i ItemDTO jest jak

int id; 
String name; 
Boolean valid; 

Kiedy zadzwonić kod następująco

Gson gson = new Gson(); 
TypeDTO[] mytypes = (TypeDTO[]) gson.fromJson(reply, TypeDTO[].class); 

wszystko wewnątrz obiektów jest null

Jednakże, jeśli mogę użyć

JSONArray i JSONObject aby wyciągnąć je kawałek po kawałku od słoików org.json, to działa dobrze i pola są odpowiednio wypełniane.

Jakieś pomysły dotyczące tego, co robię źle? czy Gson jest wyjątkowo szybki? Czy lepiej trzymać się tego, co już pracuję?

Dzięki David

+0

Musisz podać więcej informacji. Jaki jest format odbieranego JSON? Dlaczego masz tablicę 'ArrayList' w swoim' TypeDTO'? Gson radzi sobie z takimi rzeczami. – ColinD

+0

Myślałem, że dałem jasny obraz JSON. Najwyższy poziom to lista obiektów. Każdy obiekt ma wiele par kv, z których jedna to inna lista obiektów z większą liczbą par kv. – DavieDave

+0

Ktoś ma sugestię? – DavieDave

Odpowiedz

98

Przykładowa struktura danych Java w oryginalnym pytanie nie pasuje do opisu struktury JSON w komentarzu.

JSON opisano jako

"tablica {obiektu z tablicą {przedmiot}}".

Pod względem typów opisanych w pytaniu JSON języku struktury danych Java, które w zależności od struktury JSON łatwe deserializacji z Gson jest

„tablica {obiektu TypeDTO z tablicą { Obiekt ItemDTO}} ".

Jednak struktura danych Java podana w pytaniu nie jest tym. Zamiast tego jest to "tablica obiektu {TypeDTO z tablicą tablicy {objectDTO object}}".

Tablica dwuwymiarowa! = Tablica jednowymiarowa.

Ten pierwszy przykład demonstruje użycie Gson do prostego deserializacji i serializacji struktury JSON, która jest "tablicą {obiektu z tablicą {obiektu}}".

input.json treści:

[ 
    { 
    "id":1, 
    "name":"name1", 
    "items": 
    [ 
     {"id":2,"name":"name2","valid":true}, 
     {"id":3,"name":"name3","valid":false}, 
     {"id":4,"name":"name4","valid":true} 
    ] 
    }, 
    { 
    "id":5, 
    "name":"name5", 
    "items": 
    [ 
     {"id":6,"name":"name6","valid":true}, 
     {"id":7,"name":"name7","valid":false} 
    ] 
    }, 
    { 
    "id":8, 
    "name":"name8", 
    "items": 
    [ 
     {"id":9,"name":"name9","valid":true}, 
     {"id":10,"name":"name10","valid":false}, 
     {"id":11,"name":"name11","valid":false}, 
     {"id":12,"name":"name12","valid":true} 
    ] 
    } 
] 

Foo.java:

import java.io.FileReader; 
import java.util.ArrayList; 

import com.google.gson.Gson; 

public class Foo 
{ 
    public static void main(String[] args) throws Exception 
    { 
    Gson gson = new Gson(); 
    TypeDTO[] myTypes = gson.fromJson(new FileReader("input.json"), TypeDTO[].class); 
    System.out.println(gson.toJson(myTypes)); 
    } 
} 

class TypeDTO 
{ 
    int id; 
    String name; 
    ArrayList<ItemDTO> items; 
} 

class ItemDTO 
{ 
    int id; 
    String name; 
    Boolean valid; 
} 

Ten drugi przykład wykorzystuje zamiast struktury JSON, który jest faktycznie „tablica {obiektu TypeDTO z tablica tablicy {obiekt ItemDTO}} ", aby dopasować oryginalną strukturę danych Java.

input.json Zawartość:

[ 
    { 
    "id":1, 
    "name":"name1", 
    "items": 
    [ 
     [ 
     {"id":2,"name":"name2","valid":true}, 
     {"id":3,"name":"name3","valid":false} 
     ], 
     [ 
     {"id":4,"name":"name4","valid":true} 
     ] 
    ] 
    }, 
    { 
    "id":5, 
    "name":"name5", 
    "items": 
    [ 
     [ 
     {"id":6,"name":"name6","valid":true} 
     ], 
     [ 
     {"id":7,"name":"name7","valid":false} 
     ] 
    ] 
    }, 
    { 
    "id":8, 
    "name":"name8", 
    "items": 
    [ 
     [ 
     {"id":9,"name":"name9","valid":true}, 
     {"id":10,"name":"name10","valid":false} 
     ], 
     [ 
     {"id":11,"name":"name11","valid":false}, 
     {"id":12,"name":"name12","valid":true} 
     ] 
    ] 
    } 
] 

Foo.java:

import java.io.FileReader; 
import java.util.ArrayList; 

import com.google.gson.Gson; 

public class Foo 
{ 
    public static void main(String[] args) throws Exception 
    { 
    Gson gson = new Gson(); 
    TypeDTO[] myTypes = gson.fromJson(new FileReader("input.json"), TypeDTO[].class); 
    System.out.println(gson.toJson(myTypes)); 
    } 
} 

class TypeDTO 
{ 
    int id; 
    String name; 
    ArrayList<ItemDTO> items[]; 
} 

class ItemDTO 
{ 
    int id; 
    String name; 
    Boolean valid; 
} 

Odnośnie pozostałych dwóch pytań:

jest Gson bardzo szybko?

Nie porównuje się z innymi interfejsami API do deserializacji/serializacji. Gson tradycyjnie był amongst z slowest. Obecne i następne wydania Gsona zawierają znaczące ulepszenia wydajności, ale nie szukałem najnowszych danych testowych wydajności, aby potwierdzić te twierdzenia.

To powiedziawszy, jeśli Gson jest wystarczająco szybki dla twoich potrzeb, to ponieważ sprawia, że ​​deserializacja JSON jest tak łatwa, prawdopodobnie ma to sens. Jeśli wymagana jest lepsza wydajność, Jackson może być lepszym wyborem. Oferuje wiele (może nawet wszystkie) udogodnień Gson.

Czy lepiej trzymać się tego, co już pracuję?

Nie zrobiłbym tego. Jak najbardziej zawsze raczej mieć jedną prostą linię kodu podobnego

TypeDTO[] myTypes = gson.fromJson(new FileReader("input.json"), TypeDTO[].class); 

... łatwo deserializowania w złożonej strukturze danych, niż trzydziestu linii kodu, które byłyby potrzebne do mapowania części razem w jednym składniku czas.

+0

Dzięki za rozwiązanie, po trzech godzinach prób na próżno, twoja metoda była najlepsza, jaką znalazłem. – Awemo

+7

@ Programmer Bruce +1 za powiedzenie "raczej mają jedną prostą linię kodu". Moc GSON nie polega na tym, jak szybko analizuje, ale jak szybko należy napisać i zachować kod wymagany w przypadku dużej liczby przypadków produkcyjnych. A gdy trzeba zoptymalizować, model przesyłania strumieniowego GSON zapewnia duży wzrost wydajności. –

0

Użyj tej klasy komponentu bean tak, jeśli dane JSON zaczynają się od obiektu tablicy. to pomaga tobie.

Users[] bean = gson.fromJson(response,Users[].class); 

Użytkownicy to moja klasa fasoli.

Odpowiedź to moje dane JSON.

Powiązane problemy