【问题标题】:Spring + Jackson, require trailing 0 on serialisation of doubleSpring + Jackson,在 double 的序列化时需要尾随 0
【发布时间】:2017-08-03 18:09:03
【问题描述】:

我要求在使用 Jackson 的 Spring-boot 应用程序返回的数字上保留 1 位小数。

例如,值为9 的双精度应返回为9.0,值9.5 应返回为9.5

这些应该适合 json 类型“数字”,而不是“字符串”(它们周围没有引号,所以不是 "9.0",而是我在 9.0 之后。

我尝试使用 JsonGenerator 的 writeRaw(String)writeRawValue 以及各种 writeNumber 方法编写自定义序列化程序。

writeRawValue 表明它将写入值:

没有任何修改,但假设它必须构成一个单一的 合法的 JSON 值(数字、字符串、布尔值、null、数组或列表)

但是它正在删除.0,或者至少.0 在它退出spring boot 时已经消失了。我在 Json spec 中看不到任何内容,这表明需要修剪尾随 0,实际上规范本身中有一个带有 -122.026020 的示例。

如何让.0 出现在我的回复中?这是我尝试过的:

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;

import java.io.IOException;

public class MyCustomSerialiser extends JsonSerializer<Double> {

  @Override
  public void serialize(Double value, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {   
    jsonGenerator.writeRawValue("123.450");
  }
}

【问题讨论】:

  • 我删除了我的答案,因为没有注意到您不希望它成为 json 字符串的事实。但这是最简单、最常规的方法,为什么要避免将字符串作为输出?

标签: java json spring spring-boot jackson


【解决方案1】:

在您的自定义序列化程序中,只需从您的双精度数创建一个 bigdecimal,并指定您想要的精度。然后在 jsonGenerator 中调用 writeNumber。

编辑:根据用于测试结果的客户端,0 可能会自动从“视图”中删除。 OP 发现是 Postman(他用来检查结果的工具)在显示内容时删除 0,但他生成的 json 没问题。

【讨论】:

  • 谢谢 albert - 我以为会是这样,但它不适合我。我正在使用: jsonGenerator.writeNumber(new BigDecimal(123.10d).setScale(3, BigDecimal.Round_HALF_UP));输出为 123.1,缺少尾随 0。
  • 哇...好吧,这听起来很愚蠢。 Postman,我用来发送请求的客户端,去掉了不必要的 0。您的解决方案确实有效。也许我的一些其他解决方案,例如 @NumberFormat(style = Style.NUMBER, pattern = "#.0") 也可以。智者的话... Postman 的“漂亮”打印视图是默认的改变了这一点。请您将此添加到已接受的答案中以提高知名度。
【解决方案2】:

如果您使用的是 jackson 2.8.8 版,情况似乎并非如此。 还要确保您正在查看 json 的行输出。作为json查看器一些时间格式并删除尾随零。

【讨论】:

    猜你喜欢
    • 2017-10-21
    • 1970-01-01
    • 2015-08-07
    • 2019-05-17
    • 2017-07-21
    • 2020-02-05
    • 2017-10-30
    • 2011-12-02
    • 1970-01-01
    相关资源
    最近更新 更多