序列化对象时如何强制杰克逊将数字写为字符串

Posted

技术标签:

【中文标题】序列化对象时如何强制杰克逊将数字写为字符串【英文标题】:How can I force Jackson to write numbers as strings when serializing my objects 【发布时间】:2013-04-09 18:13:29 【问题描述】:

我的一个 java 对象上有一个非常大的 id。当杰克逊将其转换为 JSON 时,它会将其作为数字发送(例如 "id":1000110040000000001),但一旦它成为 javascript 对象,id 就会更改为 1000110040000000000。我读到了这个问题 here

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

【问题讨论】:

相关:***.com/a/12046979/2129835 感谢您指出这一点。显然,在 2.1.3 版本中,您可以执行以下操作:@JsonSerialize(using = ToStringSerializer.class)。如果我可以在对象映射器中设置一些整体设置仍然会很好,但如果那是不可能的,这将是可行的。 Jackson JSON custom serialization for certain fields的可能重复 【参考方案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>

【讨论】:

谢谢!这种方法可以让我以我想要的方式序列化自动生成的类,而无需更改类定义 在application.properties中,可以使用spring.jackson.generator.write-numbers-as-strings=true

以上是关于序列化对象时如何强制杰克逊将数字写为字符串的主要内容,如果未能解决你的问题,请参考以下文章

杰克逊将对象序列化为字符串

是否可以让杰克逊将嵌套对象序列化为字符串

杰克逊 - 序列化日期对象

尝试使用杰克逊序列化空瞬间时出错

杰克逊未能将字符串反序列化为 Joda-Time

如何用杰克逊反序列化空字符串?