2011-06-15 14 views
12

Ho bisogno di analizzare una risposta JSON che assomiglia:Analisi di mappe/dizionari JSON con Gson?

{"key1": "value1", 
"key2": "value2", 
"key3": 
    {"childKey1": "childValue1", 
    "childKey2": "childValue2", 
    "childKey3": "childValue3" } 
} 

class Egg { 
    @SerializedName("key1") 
    private String mKey1; 

    @SerializedName("key2") 
    private String mKey2; 

    @SerializedName("key3") 
    // ??? 
} 

Sto leggendo la documentazione GSON, ma non riesco a capire come deserializzare correttamente un dizionario per una mappa.

risposta

14

Gson gestisce prontamente la deserializzazione di un oggetto JSON con nome: coppie di valori in un Java Map.

Di seguito è riportato un esempio utilizzando il JSON dalla domanda originale. (Questo esempio dimostra anche utilizzando un FieldNamingStrategy per evitare di specificare il nome serializzato per ogni campo, a condizione che la mappatura nome del campo-per-elemento è coerente.)

import java.io.FileReader; 
import java.lang.reflect.Field; 
import java.util.Map; 

import com.google.gson.FieldNamingStrategy; 
import com.google.gson.Gson; 
import com.google.gson.GsonBuilder; 

public class Foo 
{ 
    public static void main(String[] args) throws Exception 
    { 
    GsonBuilder gsonBuilder = new GsonBuilder(); 
    gsonBuilder.setFieldNamingStrategy(new MyFieldNamingStrategy()); 
    Gson gson = gsonBuilder.create(); 
    Egg egg = gson.fromJson(new FileReader("input.json"), Egg.class); 
    System.out.println(gson.toJson(egg)); 
    } 
} 

class Egg 
{ 
    private String mKey1; 
    private String mKey2; 
    private Map<String, String> mKey3; 
} 

class MyFieldNamingStrategy implements FieldNamingStrategy 
{ 
    //Translates the Java field name into its JSON element name representation. 
    @Override 
    public String translateName(Field field) 
    { 
    String name = field.getName(); 
    char newFirstChar = Character.toLowerCase(name.charAt(1)); 
    return newFirstChar + name.substring(2); 
    } 
} 
+0

Come implementeresti una mappa in questo caso specificando il nome serializzato? –

+0

Non sono sicuro di cosa stai chiedendo. Il nome serializzato di cosa? L'esempio che ho pubblicato utilizza la FieldNamingStrategy personalizzata per specificare i nomi serializzati degli elementi JSON: che sono uguali ai nomi dei campi Java modificati per non avere l'inizio 'm' e modificati in modo che il secondo carattere del nome del campo Java sia fatto in minuscolo e usato come primo carattere del nome dell'elemento JSON. –

+0

Oh capisco. Ciò ha senso. Ma come posso definire i metodi get/set per accedere a childKey1, childKey2 e childKey3? –

1

Per quanto mi ricordo dovresti creare una classe separata per ogni oggetto json. provare qualcosa di simile:

class Key { 
    @SerializedName("childKey1") 
    private String mchildKey1; 

    @SerializedName("childKey2") 
    private String mchildKey2; 

    @SerializedName("childKey3") 
    private String mchildKey3; 
} 

class Egg { 
    @SerializedName("key1") 
    private String mKey1; 

    @SerializedName("key2") 
    private String mKey2; 

    @SerializedName("key3") 
    private Key mKey3; 
} 

Se questo non è quello che ti aspettavi si può scrivere il proprio adattatore di serializzare/deserializzare.

+0

Cercherò in schede personalizzate. Grazie. –

+3

Si noti che non è necessario implementare un deserializzatore personalizzato per deserializzare su una semplice mappa da un oggetto JSON con coppie nome: valore. Ho pubblicato un esempio pertinente in un'altra risposta a questa domanda. –