2011-06-15 3 views
12

мне нужно, чтобы разобрать ответ JSON, который выглядит как:Разбор карт JSON/словари с 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") 
    // ??? 
} 

Я читаю через документы Gson, но не могу понять, как правильно десериализации словарь в карте.

ответ

14

Gson легко обрабатывает десериализацию объекта JSON с именем: пары значений в Java Map.

Ниже приведен пример использования JSON из исходного вопроса. (Этот пример также демонстрирует использование FieldNamingStrategy, чтобы избежать указаний сериализированного имени для каждого поля, при условии, что отображение имени поля к элементу соответствует.)

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

Как бы вы реализовали карту в этом случае, указав сериализованное имя? –

+0

Я не уверен, что вы просите. Сериализованное название чего? В приведенном выше примере пользовательская FieldNamingStrategy использует заданные сериализованные имена элементов JSON: они совпадают с именами полей Java, которые были изменены, чтобы не иметь стартового «m» и изменено так, что второй символ имени поля Java сделанный в нижнем регистре и используемый в качестве первого символа имени элемента JSON. –

+0

О, я вижу. В этом есть смысл. Но как определить методы get/set для доступа к childKey1, childKey2 и childKey3? –

1

Насколько я помню, вы должны создать отдельный класс для каждого объекта json. Попробуйте что-то вроде этого:

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

Если это не то, что вы ожидали, вы можете написать свой собственный адаптер сериализации/десериализации.

+0

Я буду смотреть в специализированные адаптеры. Благодарю. –

+3

Обратите внимание, что нет необходимости внедрять настраиваемый десериализатор для десериализации на простой Map из объекта JSON с парами name: value. В другом ответе на этот вопрос я разместил соответствующий пример. –

Смежные вопросы