Gson转换为HashMap

53

有没有一种方法可以将包含JSON的字符串转换为HashMap,其中每个键都是JSON键,值是JSON键的值?该JSON没有嵌套值。我正在使用Gson库。

例如,给定JSON:

{
"id":3,
"location":"NewYork"
}

生成的HashMap:

<"id", "3">
<"location", "NewYork">

谢谢


@MattBall 给新用户的欢迎似乎不太友好。看着这个答案,它一点也不明显,也不简单。谁会使用 TypeToken 呢? - Eric Wilson
我不太确定你所说的“相当不友好的欢迎”是什么意思。我是否发布并忘记了一个刚刚被删除的粗鲁评论?回答你的问题:我不使用GSON,因此我不使用TypeToken,但我非常频繁地使用Jackson中的等效功能。 - Matt Ball
@MattBall,你曾经评论过询问已尝试了什么(附链接)并表示问题非常简单。 - Eric Wilson
相关问题:https://dev59.com/mXE85IYBdhLWcg3wbS_1 - AlikElzin-kilaka
3个回答

119

按照 GSON FAQ 的说明,使用 TypeToken

Gson gson = new Gson();
Type stringStringMap = new TypeToken<Map<String, String>>(){}.getType();
Map<String,String> map = gson.fromJson(json, stringStringMap);

无需类型转换。不必要的对象创建也不需要。


4
Type的重要性在哪里?它提供了数十种选项。 - ThePixelPony
2
@ThePixelPony 阅读 the TypeToken#getType() JavaDoc 以获取返回类型的完全限定类名。 - Matt Ball
7
java.lang.reflect.Type stringStringMap = new com.google.gson.reflect.TypeToken<Map<String, String>>(){}.getType();这段代码的作用是定义一个名为 stringStringMap 的变量,它的类型是 java.lang.reflect.Type。该变量存储了一个 Map<String, String> 类型的对象,并使用了 Google Gson 库中的 TypeToken 类来获取该类型的信息。 - stackoverflowuser2010
2
这个代码可以运行,但是你的值类型没有被尊重--一切都被视为字符串。如果你将其更改为Map<String, Object>,那么你将得到正确类型的值。 - Xaero Degreaz
1
@XaeroDegreaz 这个问题微妙地建议这些值也应该是字符串,但没关系。 - Matt Ball
显示剩余4条评论

9

如果我在使用TypeToken解决方案时,使用Map<Enum, Object>会出现“重复键:null”的错误。

对我来说最好的解决方案是:

String json = "{\"id\":3,\"location\":\"NewYork\"}";
Gson gson = new Gson();
Map<String, Object> map = new HashMap<String, Object>();
map = (Map<String, Object>)gson.fromJson(json, map.getClass());

结果:

{id=3.0, location=NewYork}

2

我喜欢:

private static class MyMap extends HashMap<String,String> {};
...
MyMap map = gson.fromJson(json, MyMap.class);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接