2011-06-15 22 views
12

tengo que analizar una respuesta JSON que se parece a:Análisis de mapas JSON/diccionarios 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") 
    // ??? 
} 

estoy leyendo a través de los documentos GSON pero no puedo encontrar la manera de deserializar correctamente un diccionario a un mapa.

Respuesta

14

Gson maneja fácilmente la deserialización de un objeto JSON con nombre: pares de valores en Java Map.

A continuación se muestra un ejemplo de cómo usar el JSON de la pregunta original. (Este ejemplo también demuestra el uso de un FieldNamingStrategy de no especificar el nombre de serie para todos los campos, siempre que la asignación de nombre de campo a elemento es consistente.)

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

¿Cómo implementaría un Mapa en este caso al especificar el nombre serializado? –

+0

No estoy seguro de lo que estás preguntando. El nombre serializado de qué? El ejemplo que publiqué utiliza la FieldNamingStrategy personalizada para especificar los nombres serializados de los elementos JSON: que son los mismos que los nombres de los campos Java modificados para no tener la 'm' inicial y cambiados para que el segundo carácter del nombre de campo de Java sea hecho en minúscula y utilizado como el primer carácter del nombre del elemento JSON. –

+0

Oh, ya veo. Eso tiene sentido. Pero, ¿cómo puedo definir los métodos get/set para acceder a childKey1, childKey2 y childKey3? –

1

Por lo que recuerdo, debe crear una clase separada para cada objeto json. Pruebe algo como esto:

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; 
} 

Si esto no es lo que esperaba usted puede escribir su propio adaptador de serializar/deserializar.

+0

Voy a mirar en los adaptadores personalizados. Gracias. –

+3

Tenga en cuenta que no es necesario implementar un deserializador personalizado para deserializar a un simple Map desde un objeto JSON con nombre: pares de valores. Publiqué un ejemplo relevante en otra respuesta a esta pregunta. –