如何使用 Jackson JSON 处理器序列化 Joda DateTime?
如何让 Jackson 根据简单的模式(如“dd-MM-yyyy”)序列化我的 Joda DateTime 对象?
我试过了:
@JsonSerialize(using=DateTimeSerializer.class)
private final DateTime date;
我也试过了:
ObjectMapper mapper = new ObjectMapper()
.getSerializationConfig()
.setDateFormat(df);
谢谢!
How do I get Jackson to serialize my Joda DateTime object according to a simple pattern (like "dd-MM-yyyy")?
I've tried:
@JsonSerialize(using=DateTimeSerializer.class)
private final DateTime date;
I've also tried:
ObjectMapper mapper = new ObjectMapper()
.getSerializationConfig()
.setDateFormat(df);
Thanks!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(10)
使用 Jackson 2.0 和 Joda 模块,这变得非常容易。
Maven依赖:
代码和文档:
https://github.com/FasterXML/jackson-datatype-joda
二进制文件:
http://repo1.maven.org/maven2/com/fasterxml/jackson /数据类型/杰克逊-数据类型-joda/
This has become very easy with Jackson 2.0 and the Joda module.
Maven dependency:
Code and documentation:
https://github.com/FasterXML/jackson-datatype-joda
Binaries:
http://repo1.maven.org/maven2/com/fasterxml/jackson/datatype/jackson-datatype-joda/
在您要映射的对象中:
在 CustomDateSerializer 中:
In the object you're mapping:
In CustomDateSerializer:
正如 @Kimble 所说,对于 Jackson 2,使用默认格式非常简单;只需在您的
ObjectMapper
上注册JodaModule
即可。对于
DateTime
的自定义序列化/反序列化,您需要实现自己的StdScalarSerializer
和StdScalarDeserializer
;这很复杂,但无论如何。例如,这是一个使用
ISODateFormat
和 UTC 时区的DateTime
序列化器:以及相应的反序列化器:
然后将它们与模块绑定在一起:
然后注册模块在您的
ObjectMapper
上:As @Kimble has said, with Jackson 2, using the default formatting is very easy; simply register
JodaModule
on yourObjectMapper
.For custom serialization/de-serialization of
DateTime
, you need to implement your ownStdScalarSerializer
andStdScalarDeserializer
; it's pretty convoluted, but anyway.For example, here's a
DateTime
serializer that uses theISODateFormat
with the UTC time zone:And the corresponding de-serializer:
Then tie these together with a module:
Then register the module on your
ObjectMapper
:简单的解决方案
我遇到过类似的问题,我的解决方案比上面清楚得多。
我只是使用了
@JsonFormat
注释中的模式基本上我的类有一个
DateTime
字段,所以我添加了一个注释围绕 getter:我使用
ObjectMapper
序列化该类,我们使用 Jackson 2.5.4
The easy solution
I have encountered similar problem and my solution is much clear than above.
I simply used the pattern in
@JsonFormat
annotationBasically my class has a
DateTime
field, so I put an annotation around the getter:I serialize the class with
ObjectMapper
We use Jackson 2.5.4
https://stackoverflow.com/a/10835114/1113510
虽然您可以为每个日期字段添加注释,但更好为您的对象映射器进行全局配置。如果您使用 jackson,您可以按如下方式配置 spring:
对于 CustomObjectMapper:
当然,SimpleDateFormat 可以使用您需要的任何格式。
https://stackoverflow.com/a/10835114/1113510
Although you can put an annotation for each date field, is better to do a global configuration for your object mapper. If you use jackson you can configure your spring as follow:
For CustomObjectMapper:
Of course, SimpleDateFormat can use any format you need.
同时,当 JodaModule 位于类路径中时,Jackson 会自动注册 Joda 模块。我刚刚将 jackson-datatype-joda 添加到 Maven,它立即生效。
JSON 输出:
Meanwhile Jackson registers the Joda module automatically when the JodaModule is in classpath. I just added jackson-datatype-joda to Maven and it worked instantly.
JSON output:
对于使用 Spring Boot 的用户,您必须将模块添加到您的上下文中,它将像这样添加到您的配置中。
如果你想使用新的java8时间模块jsr-310。
For those with Spring Boot you have to add the module to your context and it will be added to your configuration like this.
And if you want to use the new java8 time module jsr-310.
我正在使用 Java 8,这对我有用。
添加对
pom.xml
的依赖,并在
ObjectMapper
上添加 JodaModuleI'm using Java 8 and this worked for me.
Add the dependency on
pom.xml
and add JodaModule on your
ObjectMapper
似乎对于 Jackson 1.9.12 默认情况下不存在这种可能性,因为:
该类使用 Joda DateTime 的 toString() 方法序列化数据。
Rusty Kuntz 提出的方法非常适合我的案例。
It seems that for Jackson 1.9.12 there is no such possibility by default, because of:
This class serializes data using toString() method of Joda DateTime.
Approach proposed by Rusty Kuntz works perfect for my case.
使用内置 Joda 序列化器/反序列化器进行轻松配置
如果您想要自定义格式,则无需编写自定义序列化器或反序列化器。
jackson-datatype-joda
2.x 提供了DateTimeSerializer
和DateTimeDeserializer
您可以在其上设置DateTimeFormatter
> 使用,为您提供自定义格式。然后,在添加模块时将配置的序列化器和/或反序列化器添加到JodaModule
中。使用提供的序列化器/反序列化器(相对于自定义序列化器)的一个优点是,您可以使用
@JsonFormat(pattern = ". . .")
注释任何DateTime
属性以覆盖您配置的格式。大多数其他答案(从 Jackson 1.x 开始)中显示的自定义序列化器/反序列化器将不支持@JsonFormat
注释。因此,如果您有一个奇怪的DateTime
值需要不同的格式,那么很容易处理,如下面的示例所示。除了
DateTimeSerializer
和DateTimeDeserializer
之外,还有LocalDateSerializer
/LocalDateDeserializer
、PeriodSerializer< /code>/
PeriodDeserializer
等。示例
下面是一个 Java 和一个 Kotlin 示例。您需要将以下内容添加到依赖项中:
com.fasterxml.jackson.datatype:jackson-datatype-joda:{version}
这些示例显示了设置默认自定义格式以及在通过
@JsonFormat
注释基于每个属性。Java 示例
Kotlin 示例
Use Built-in Joda Serializer/Deserializer for easy config
If you want custom formatting, there's no need to write a custom Serializer or Deserializer.
jackson-datatype-joda
2.x provides aDateTimeSerializer
andDateTimeDeserializer
on which you can set aDateTimeFormatter
to use, providing you custom formatting. You then add the configured Serializer and/or Deserializer to theJodaModule
when you add the module.An advantage of using the provided Serializer/Deserializer (over custom ones) is that you can annotated any
DateTime
properties with@JsonFormat(pattern = ". . .")
to override the format you configure. The custom Serializers/Deserializers shown in most of the other answers (from the Jackson 1.x days) will not honor@JsonFormat
annotations. So if you have that one odd ballDateTime
value that needs a a different format, it is easily handled, as shown in the below examples.In addition to the
DateTimeSerializer
andDateTimeDeserializer
, there are others such asLocalDateSerializer
/LocalDateDeserializer
,PeriodSerializer
/PeriodDeserializer
, etc.Examples
Below is a Java and a Kotlin example. You will need to add the following to your dependencies:
com.fasterxml.jackson.datatype:jackson-datatype-joda:{version}
The examples show setting a default custom format, and overriding that format on a per property basis via the
@JsonFormat
annotation.Java Example
Kotlin Example