【问题标题】:pretty print JSON using java, without formatting the values使用 java 漂亮地打印 JSON,而不格式化值
【发布时间】:2018-08-10 08:17:43
【问题描述】:

我知道大多数 Java json 库都可以很好地打印出来

  • 解析成通用模型,然后
  • 序列化模型。

StackOverflow 上有无数现有问题,它们告诉您使用 Jackson 或 GS​​ON 以这种方式漂亮地打印 json,例如 Pretty-Print JSON in Java

但是,我发现使用 Jackson ObjectMapper 来执行此操作,如果我有十进制值,例如“10000.00”,它会将它们解析为 BigDecimal 或 Double,然后最终将其写为“10000.0”(双精度)或"1E+4" (BigDecimal)。

我想要的是一种格式化 JSON 的方式,它只影响空格,并且不会干扰任何值的内容 - 如果输入是“10000.00”,则输出必须是“10000.00”

有谁知道可以处理这个问题的 Java JSON 库吗?

【问题讨论】:

  • 你能显示代码吗
  • 链接问题中显示了使用 ObjectMapper 的代码,但这并不符合我的要求。 ObjectMapper mapper = new ObjectMapper(); System.out.println(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(jsonObject))

标签: java json jackson pretty-print


【解决方案1】:

Underscore-java 库有静态方法U.formatJson(json)。它将保持 double 值不变。 12.0 将被格式化为 12.0。我是项目的维护者。

【讨论】:

  • 太好了,我去看看,然后告诉你我的进展情况。
  • 我快速检查了一下,确实是12.0 -> 12.0。但是,10000.00 -> 10000.0 我宁愿保留为10000.00。仍然比获得1E+4 更好。此外,我需要将多个 JSON 格式连接到一个文件中,这在之前使用 Jackson parser.readValueAsTree() 时可以做到。有没有办法在你的 JSON 解析器中做到这一点?
  • 我们可以将数据读入Map<String, Object>结构。有静态方法U.fromJsonMap(json)U.toJson(map)
  • 我会准备一个新的库版本。它将格式化数字10000.00 -> 10000.00
  • 新库版本发布!
【解决方案2】:

JSON {"value":5.0}{"value":"5.0"} 之间存在差异,在第二种情况下,"5.0" 值将被视为 String 并且不会被修改。在第一种情况下,它将被检测为数字并且可以修改。因此,要么要求你的 JSON 引用数值,要么在解析 JSON 字符串之前在你的代码中自己做。此外,如果您自己从某个对象生成 JSON,那么如果您有

private Double myValue;

有吸气剂

@JsonIgnore
Double getMyValue() {
  return myValue;
}

并添加另一个 getter

  @JsonProperty(name="myValue")
  String getMyValueStr() {
    return myValue.toString();
  }

所有注释都是给 Jason-Jackson 的。

【讨论】:

  • 就我而言,我没有模型类。因此,破解模型无济于事。无论如何,我想避免整个解析/序列化问题并找到一个专门用于格式化的工具。
猜你喜欢
  • 2021-09-19
  • 2015-07-03
  • 2015-08-26
  • 2023-04-04
  • 1970-01-01
相关资源
最近更新 更多