使用GSON将Hashmap转换为JSON

15

我有一个 HashMap<String, String>,其中值字符串可以是long或double。例如,123.000 可以存储为 123(存储为long),123.45 可以存储为 123.45(double)。

考虑下面两个哈希映射值:

("one", "123"); ("two", "123.45")

当我将上述哈希映射转换为JSON字符串时,JSON值不应带有双引号,如下所示:

期望的结果:{"one": 123, "two": 123.45 }

实际结果:{"one": "123", "two": "123.45" }

这是我的代码:

String jsonString = new Gson().toJson(map)

我更喜欢使用GSON作为解决方案,但可以使用其他库或多个库。


4
实际上,是的,他们应该 - hd1
3
将当前的地图转换为一个 Map<String,Double>Map<String, Number>,并存储适当的值。 - Sotirios Delimanolis
为什么如果你不喜欢这个问题就要点踩呢?提出上述问题并没有什么错。 - user3366706
@SotiriosDelimanolis 使用 Map<String, Double> 或 Map<String, Number> 将值转换为 { "one": 123.0, "two": 123.45 },其中存在我不希望在最终的 JSON 中出现的额外零。 - user3366706
1
对我来说,使用 Map<String, Number> 很好用。我使用 map.put("one", 125); 并打印出 {"one":125} - Sotirios Delimanolis
为了将123.000000转换为123(而不是123.000),以及将123.456789转换为123.456,我从Map<String,Double>中读取值,修剪不需要的零,并四舍五入,然后将结果存储在Map<String,String>中。但是,如果我按照您所说的那样做,那么我就无法摆脱这些不需要的零/四舍五入。 - user3366706
2个回答

8
对于Gson,您将获得以下转换:
Map<String, Double> -> {"one": 123, "two":123.45}
Map<String, Number> -> {"one": 123, "two":123.45}
Map<String, String> -> {"one": "123", "two": "123.45"}

基本上,没有办法让Gson自动将字符串转换为数字值。如果您希望它们显示为数字(即没有引号),则需要在映射中存储适当的数据类型,如DoubleNumber
此外,Json只有有限数量的基本类型,它存储字符串或数字。数字值不区分IntegerLongDouble等,因此我不确定您为什么要区分它们。一旦存储为Json,所有内容都被视为相同的数字类型。

是的,但我想根据问题中提到的更改其默认行为。 - user3366706
为什么不直接使用/转换成Map<String, Double>呢?试图区分Double和Integer并没有意义,因为一旦它被转换成Json格式,你只有一个数字类型。 - bcorso
使用Map<String, Double>或Map<String, Number>将值转换为{ "one": 123.0, "two": 123.45 },其中存在我不想要的额外零。 - user3366706
1
@user3366706没关系,因为json不区分整数和双精度浮点数,它只是一种数字数据类型 -- json值123和123.0是相同的。重要的是在将json转换回Java时,您的映射中的数据类型:Map<String, Double>将假定一切都是double(即使没有小数),而Map<String, Integer>将假定一切都是int(即使有小数)。如果您真的想保留精确格式,则必须将其存储为字符串“123”。 - bcorso
@user3366706 是的,但真正的答案是,一旦它在json中,0是否存在并不重要,所以你不应该试图控制它。如果您需要完全相同的格式,则从一开始就有解决方案--使用String类型。 - bcorso
显示剩余2条评论

0
这个回答有点晚了,但是对于像我一样遇到这个问题的人会很有帮助。
使用以下链接构建您自己的定制Gson序列化程序,它将把数字字符串解析为适当的数字类型(基于小数点的简单if-else或switch)。 Gson自定义序列化和反序列化

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