Java 使用GSON将Hashmap转换为JSON

Java 使用GSON将Hashmap转换为JSON,java,json,gson,Java,Json,Gson,我有一个HashMap,其中的值字符串可以是长字符串,也可以是双精度字符串。例如,123.000可以存储为123(存储长度相同),而123.45可以存储为123.45(双精度) 取以下两个hashmap值: (“一”、“123”);(“两个”、“123.45”) 当我将上面的映射转换为JSON字符串时,JSON值不应该有双引号,如 预期:{“一”:123,“二”:123.45} 实际:{“一”:“123”,“二”:“123.45”} 下面是我的代码: String jsonString = ne

我有一个
HashMap
,其中的值字符串可以是长字符串,也可以是双精度字符串。例如,
123.000
可以存储为
123
(存储长度相同),而
123.45
可以存储为
123.45
(双精度)

取以下两个hashmap值:

(“一”、“123”);(“两个”、“123.45”)

当我将上面的映射转换为JSON字符串时,JSON值不应该有双引号,如

预期:{“一”:123,“二”:123.45}

实际:{“一”:“123”,“二”:“123.45”}

下面是我的代码:

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

我更喜欢使用GSON的解决方案,但也欢迎使用其他库。

对于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"}
Map->{“一”:123,“二”:123.45}
Map->{“一”:123,“二”:123.45}
地图->{“一”:“123”,“二”:“123.45”}
基本上,没有办法让Gson自动将字符串转换为数值。如果希望它们显示为数字(即不带引号),则需要在映射中存储相应的数据类型,
Double
Number


此外,Json只有有限数量的基元类型,它存储字符串或数字。数值不能区分
整数
双精度
等。因此,我不确定您为什么要尝试区分它们。一旦它被存储为Json,它就被认为是相同的数字类型。

现在回答这个问题已经很晚了,但它会帮助像我这样偶然发现这个问题的人

使用以下链接构建自定义Gson序列化,该序列化将把数字字符串解析为适当的数字类型。(简单的if-else或基于小数点的开关)


实际上,是的,将当前地图转换为
地图
,或
地图
,并存储适当的值。如果你不喜欢这个问题,为什么要向下投票?问上面的问题没有错。@SotiriosDelimanolis使用Map或Map将值转换为{“一”:123.0,“二”:123.45},其中有额外的零,我不希望在最终的JSON中使用这些零,使用
Map
对我来说很好。我使用
map.put(“一”,125)并打印
{“one”:125}
。是的,但我想更改其默认行为,如中所述question@user3366706为什么不直接使用/转换为地图呢。试图区分Double和Integer是没有意义的,因为一旦它出现在Json中,您就只有一个数字类型了。@user3366706我很确定我理解您的问题。答案是Gson不是这样工作的。当从
Map
转换为json时,它不会尝试将字符串转换为数值。您需要从
Map
Map
开始。使用Map或Map将值转换为{“一”:123.0,“二”:123.45},其中有额外的零,我不希望在最终结果中使用这些零json@user3366706这两种方式都无关紧要,因为json不区分整数和双精度,它只是一个数字数据类型——json值123与123.0相同。当您尝试将json转换回Java时,重要的是映射中的数据类型:映射将假定所有内容都是双精度的(即使没有小数),而映射将假定所有内容都是int(即使有小数)。如果你真的想保持精确的格式,你必须将它存储为一个字符串“123”。