反序列化 Map
我有一个包含混合类型的 Map,就像这个简单的示例一样,
final Map<String, Object> map = new LinkedHashMap<String, Object>();
map.put("a", 1);
map.put("b", "a");
map.put("c", 2);
final Gson gson = new Gson();
final String string = gson.toJson(map);
final Type type = new TypeToken<LinkedHashMap<String, Object>>(){}.getType();
final Map<Object, Object> map2 = gson.fromJson(string, type);
for (final Entry<Object, Object> entry : map2.entrySet()) {
System.out.println(entry.getKey() + " : " + entry.getValue());
}
我返回的是普通的 Object
,没有 Integer
,没有 String
s。输出看起来像
a : java.lang.Object@48d19bc8
b : java.lang.Object@394a8cd1
c : java.lang.Object@4d630ab9
我可以以某种方式修复它吗?我希望默认情况下能够正确处理这种简单的情况。
我知道有关类型的信息并不总是能够保留,并且可能 1
和 "1"
在 JSON 中的含义完全相同。然而,返回简单的无内容对象对我来说毫无意义。
更新:序列化版本(即上面的字符串
)看起来不错:
{"a":1,"b":"a","c":2}
I have a Map containing a mixture of types like in this simple example
final Map<String, Object> map = new LinkedHashMap<String, Object>();
map.put("a", 1);
map.put("b", "a");
map.put("c", 2);
final Gson gson = new Gson();
final String string = gson.toJson(map);
final Type type = new TypeToken<LinkedHashMap<String, Object>>(){}.getType();
final Map<Object, Object> map2 = gson.fromJson(string, type);
for (final Entry<Object, Object> entry : map2.entrySet()) {
System.out.println(entry.getKey() + " : " + entry.getValue());
}
What I get back are plain Object
s, no Integer
s, no String
s. The output looks like
a : java.lang.Object@48d19bc8
b : java.lang.Object@394a8cd1
c : java.lang.Object@4d630ab9
Can I fix it somehow? I'd expect that such simple cases will be handled correctly by default.
I know that the information about the type can't always be preserved, and possibly 1
and "1"
means exactly the same in JSON. However, returning plain content-less objects just makes no sense to me.
Update: The serialized version (i.e. the string
above) looks fine:
{"a":1,"b":"a","c":2}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
Gson没那么聪明。相反,提供一个 Javabean 类风格的清晰静态数据结构,以便 Gson 理解单独的属性应该反序列化为什么类型。
例如,
与
更新结合使用:根据评论,键集似乎不固定(尽管您似乎可以在事后手动转换它而无需事先了解结构)。您可以创建自定义反序列化器。这是一个简单的例子。
您可以按如下方式使用:
Gson isn't that smart. Rather provide a clear and static data structure in flavor of a Javabean class so that Gson understands what type the separate properties are supposed to be deserialized to.
E.g.
in combination with
Update: as per the comments, the keyset seems to be not fixed (although you seem to be able to convert it manually afterwards without knowing the structure beforehand). You could create a custom deserializer. Here's a quick'n'dirty example.
which you use as follows:
升级到 Gson 2.1。它打印出这个:
Upgrade to Gson 2.1. It prints this:
您将数据存储在地图中。看起来您需要将对象转换为您需要的类型。
You are storing the data in a Map. It looks like you need to cast the object to the type you need.
如果您想要来自
Map
的 JSON 字符串,我认为json-simple
是比Gson
更好的选择。这是 http://code.google.com/p/json 的简短示例-simple/wiki/EncodingExamples :
结果:
{"name":"foo","num":100,"balance":1000.21,"is_vip":true,"nickname":null}
解码参考http://code.google.com/p/json-simple/wiki/DecodingExamples 。
If you want a JSON string from
Map<Object, Object>
, I thinkjson-simple
is better choice thanGson
.This is a brief example from http://code.google.com/p/json-simple/wiki/EncodingExamples :
Result:
{"name":"foo","num":100,"balance":1000.21,"is_vip":true,"nickname":null}
For decoding, refer to http://code.google.com/p/json-simple/wiki/DecodingExamples .