【问题标题】:HashMap to gson with maps as valuesHashMap 到 gson,地图作为值
【发布时间】:2017-08-25 07:44:27
【问题描述】:

我想用这种方法将HashMap转换成JSON格式:

public String JSObject(Object object) {
        Gson gson = new Gson();
        return gson.toJson(object);
}

但问题是,当我的 HashMap 有另一个 HashMap 作为结果中的键时,我在 JSON 中什么都没有。假设我在 Java 中有这样的东西:

put("key", HashMap);

转换后我的 JSON 如下所示:

"key" : {}

我想要的显然是这些:

"key" : {
    "key1" : "value1",
    "key2" : "value2"
}

这是因为toJson() 不支持更复杂的JSON 吗?我认为这更有可能是我做错了什么。

@EDIT

这是我初始化地图的方式:

put("key", new HashMap<String,String>(){{
                put("key1", "value1");
            }};

【问题讨论】:

  • 不可能...我们能看到那个代码吗?
  • 对我来说效果很好,你确定你的地图不是空的吗?
  • 嘿,感谢您的回复,我编辑了问题以显示我如何初始化地图

标签: java json gson


【解决方案1】:

有了这个:

final HashMap<String, String> value = new HashMap<String, String>(){{
    put("key1", "value1");
}};

您正在使用instance initializer 创建新的AnonymousInnerClass。

来自Gson docs:

Gson 还可以反序列化静态嵌套类。但是,Gson 不能自动反序列化纯内部类,因为它们的无参数构造函数还需要对包含 Object 的引用,而在反序列化时该引用不可用。

只需将您的地图更改为不使用instance initializer:

final Map<String, String> value = new HashMap<>();
value.put("key", "value");

【讨论】:

  • 换句话说,我需要改进我的方法。我说的对吗?
  • 不要使用instance initializer,因为它会创建gson无法序列化的匿名内部类
  • 是的,这是最简单的解决方案。但我很好奇是否可以更改我的JSObject 方法以让我使用匿名类
  • 这看起来不是问题。当问题询问序列化时,您正在谈论 de序列化。
猜你喜欢
  • 2013-02-03
  • 1970-01-01
  • 2020-07-15
  • 2014-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多