【问题标题】:Convert Hashmap to JSON using GSON使用 GSON 将 Hashmap 转换为 JSON
【发布时间】:2015-07-24 22:22:43
【问题描述】:

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

取这两个hashmap值:

("一个", "123"); ("二", "123.45")

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

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

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

下面是我的代码:

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

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

【问题讨论】:

  • 其实是的they should
  • 将您当前的地图转换为Map<String,Double>Map<String, Number> 并存储适当的值。
  • 如果您不喜欢这个问题,为什么要投反对票?问上面的问题没有错。
  • @SotiriosDelimanolis 使用 Map 或 Map 将值转换为 { "one": 123.0, "two": 123.45 } 其中有额外的零我不想在最终的 json 中
  • 使用Map<String, Number> 对我来说效果很好。我使用map.put("one", 125);,它会打印{"one":125}

标签: java json gson


【解决方案1】:

对于 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。尝试区分 Double 和 Integer 是没有意义的,因为一旦它在 Json 中,你所拥有的只是一个数字类型。
  • @user3366706 我很确定我理解你的问题。答案是 Gson 不是这样工作的。从Map&lt;String,String&gt; 转换为 json 时,它不会尝试将您的字符串转换为数值。您需要以Map&lt;String, Double&gt;Map&lt;String, Number&gt; 开头。
  • 使用 Map 或 Map 将值转换为 { "one": 123.0, "two": 123.45 } 我没有额外的零'不想在最终的 json 中
  • @user3366706 这两种方式都没有关系,因为 json 不区分整数和双精度,它只是一个数字数据类型——json 值 123 与 123.0 相同。当您尝试将 json 转换回 Java 时,重要的是地图中的数据类型: Map 将假定一切都是双精度的(即使没有小数点),而 Map 将假定一切都是 int (即使它有小数)。如果您真的想保持准确的格式,您必须将其存储为字符串“123”。
【解决方案2】:

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

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

Gson Custom Serialization and Deserialization

【讨论】:

    猜你喜欢
    • 2011-02-16
    • 2020-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多