Подтвердить что ты не робот

Разбор карт JSON/словарей с Gson?

Мне нужно разобрать ответ JSON, который выглядит так:

{"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, но не могу понять, как правильно десериализовать словарь на карте.

4b9b3361

Ответ 1

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

Ответ 2

Насколько я помню, вы должны создать отдельный класс для каждого 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;
}

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