2012-12-06 9 views
6

So che ci sono molti JSON con domande di GSON ma nessuno di essi si riferisce direttamente a me. My JSON è formattato in modo diverso.Utilizzo di Gson per analizzare l'array JSON e l'oggetto senza nome

ho un i dati JSON voglio analizzare utilizzando GSON che si presenta come il seguente:

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

e ho le classi del modello:

ItemArray Classe

public class ItemArray 
{ 
    List<Item> itemArray; 

    //Get set here 
} 

Elemento Classe

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

    //Get set here 
} 

Bar Class

public class Bar 
{ 
    String id; 

    //Get set here 
} 

Heres la questione. Il JSON è nel formato corretto? In tal caso, le classi del modello sono nel formato corretto?

In caso contrario, per favore spingimi nella giusta direzione. Grazie in anticipo!

PS. Posso modificare il formato dati JSON se necessario.

risposta

6

Secondo il vostro JSON, si dovrebbe semplicemente avere:

public class ItemArray extends List<Item> { 
} 

se si desidera mantenere voi classe Java e cambiare la tua JSON che dovrebbe essere:

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

Oh, e c'è un mancata corrispondenza con l'id e _id per Bar:

public class Bar 
{ 
    String _id; 

    //Get set here 
} 

Si potrebbe anche usare un'annotazione per modificare il campo di nome durante Json de/serialization.

E, ultimo ma non meno importante, si consiglia di digitare i valori meglio. Non vedere i dati come stringhe se non lo sono, non si elaborerà molto nel codice Java per convertire le cose. Ad esempio:

"foo" : 1, 

e vedere foo come membro di dati int, non una stringa.

+0

quindi in altre parole, tutto ciò di cui ho bisogno è che una classe ItemArray + th e Classe di corso ovviamente SENZA modificare il mio formato JSON? –

+0

Penso di sì sì. E cambiando barra da id a _id. – Snicolas

+0

ok lemme provalo –

0

Per controllare JSON è valido, utilizzare questo strumento 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 
} 

si denominata di elenco di elementi "ItemArray", ma nel tuo JSON non hanno chiamato al corrispondente matrice di elementi "ItemArray". Quindi rendilo itemArray, il problema non è nel tuo json, è valido. Il problema è nella sua rappresentazione per Gson, chiavi della mappa di Gson di JSON sulle variabili dell'oggetto (cioè POJO Java) con lo stesso nome. Se il nome della lista è classe è

List<Item> itemArray; 

poi il corrispondente nome di matrice JSON dovrebbe anche essere ItemArray, prendere un colpo un'occhiata

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

modo da poter convertire JSON in oggetto come quello

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

Date un'occhiata in riferimento colpo per maggiori dettagli https://stackoverflow.com/questions/13625206/how-to-parse-the-result-in-java/13625567#13625567

012.351.641.061.
+0

la prima risposta ha risposto alla mia domanda. ma grazie per la tua risposta e intuizione. Lo terrò a mente in futuro: D –

+0

Cosa succede se non riesco a modificare il formato JSON. Cioè, come impostare il modello se non riesco ad aggiungere "itemArray" nel json? Grazie. –

4

Alcune volte otteniamo JsonArray [ {..} , {..} ] come risposta (senza 'itemArray' nome come il vostro) In questo caso è possibile utilizzare seguente codice

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

trovare di più su questo Official doc - Gson Array-Examples

2

Se si dispone di un JsonArray come [ {..} , {..} ] puoi farlo con Gson:

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

come posso analizzare ulteriormente ... cioè accedere a String in Item.class? –

Problemi correlati