用Gson解析JSON地图/字典?

问题描述

| 我需要解析一个类似于以下内容的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文档,但无法弄清楚如何正确地将字典反序列化为Map。     

解决方法

        Gson可以轻松地将具有name:value对的JSON对象反序列化为Java
Map
。 以下是使用原始问题中的JSON的示例。 (此示例还演示了使用ѭ2来避免为每个字段指定序列化名称,只要字段到元素的名称映射是一致的。)
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);
  }
}
    ,        据我记得,您应该为每个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;
}
如果这不是您期望的,则可以编写自己的序列化/反序列化适配器。     

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...