【问题标题】:Deserialize an EnumMap using gson使用 gson 反序列化 EnumMap
【发布时间】:2017-04-11 05:21:28
【问题描述】:

我有一个格式如下的 json 字符串,我正在尝试使用 gson 对其进行反序列化

{
  "MAPS": [
    {
      "value": true,
      "enabled": [
        {
          "isoCountryCode": "USA"
        }
      ]
    }
  ]
}

下面是我的类和枚举的结构

public class Configuration {
  private Map<EnumType, List<Object>> enumToObjectMap;
}

   public enum EnumType {
     MAPS;
}

当我尝试使用

对其进行反序列化时
new Gson().fromJson(jsonString, Configuration.class)

我得到了 enumToObjectMap 的空值。请帮助我解决同样的问题。

【问题讨论】:

  • 你在哪里得到空值?
  • enumToObjectMap 的值为 null。
  • 你可以发布实际的 JSON 吗?
  • 更新了帖子。

标签: java dictionary enums gson


【解决方案1】:

可能有更正确的解决方案,但这里有几个解决方法:

  1. 将 JSON 字符串包装在父字段中:

    jsonString = "{\"enumToObjectMap\":" + jsonString + "}";
    Configuration c = new Gson().fromJson(jsonString, Configuration.class);
    
  2. 独立反序列化地图并通过构造函数或设置器将其传递给您的类:

    Configuration c = new Configuration();
    c.setMap(new Gson().fromJson(jsonString,
            new TypeToken<EnumMap<EnumType, List<Object>>>() {}.getType()));
    

【讨论】:

  • Gson 2.8.0 在这种情况下不会实例化 EnumMap。不过,不确定这是错误还是设计选择。
  • 上述方法将在我的代码中引入硬编码,并且不可扩展和通用。如果稍后我的班级组成了另一个也有枚举映射的班级的对象怎么办?
  • 为这个类编写一个自定义的反序列化器解决了这个问题。
【解决方案2】:

您可以通过添加此代码进行验证:

BufferedReader br = new BufferedReader(new InputStreamReader(request.getInputStream()));
String json = "";
///////////////////////////
StringBuilder sb = new StringBuilder();

////////////////////////////////////
if (br != null) {

    json = br.readLine();
    sb.append(json);
    System.out.println(json);
}
JSONObject jso = new JSONObject(sb.toString());
System.out.println(jso);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-04
    • 2017-01-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多