如何强制 Jackson 在序列化对象时将数字写入字符串

2022-09-02 05:24:30

我的一个java对象上有一个非常大的ID。当它被 jackson 转换为 JSON 时,它会将其作为一个数字向下发送(例如 {“id”:1000110040000000001}),但是一旦它成为 javascript 对象,id 就会更改为 1000110040000000000。我在这里读到这个问题

当 id 较小时,它可以正常工作。我的第一个想法是强迫杰克逊将所有数字转换为字符串,但我也对其他选项持开放态度。如果可能的话,我宁愿不将Jackson注释添加到我的java对象中。


答案 1

Jackson-databind(至少 2.1.3)提供了特殊的 ToStringSerializer。这为我做到了。

@Id @JsonSerialize(using = ToStringSerializer.class)
private Long id;

答案 2

com.fasterxml.jackson.core:jackson-core:2.5.4提供了配置JsonGenerator.Feature.WRITE_NUMBERS_AS_STRINGS。ObjectMapper

final ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(JsonGenerator.Feature.WRITE_NUMBERS_AS_STRINGS, true);

Foo foo = new Foo(10);
System.out.println("Output: " + objectMapper.writeValueAsString(foo));

输出: {“a”:“1”}

class Foo {
    @XmlElement(name = "a")
    Integer a
}

要包含依赖项,请执行以下操作:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.7.2</version>
</dependency>