public class LocalDateTimeSerializer extends JsonSerializer<LocalDateTime> {
@Override
public void serialize(LocalDateTime arg0, JsonGenerator arg1, SerializerProvider arg2) throws IOException {
arg1.writeString(arg0.toString());
}
}
public class LocalDateTimeDeserializer extends JsonDeserializer<LocalDateTime> {
@Override
public LocalDateTime deserialize(JsonParser arg0, DeserializationContext arg1) throws IOException {
return LocalDateTime.parse(arg0.getText());
}
}
随机事实:如果我嵌套了上述类,并且没有使它们成为静态的,那么错误消息很奇怪: org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'application/json;charset=UTF-8' not supported
@Provider
public class JacksonObjectMapper implements ContextResolver<ObjectMapper> {
final ObjectMapper defaultObjectMapper;
public JacksonObjectMapper() {
defaultObjectMapper = createDefaultMapper();
}
@Override
public ObjectMapper getContext(Class<?> type) {
return defaultObjectMapper;
}
private static ObjectMapper createDefaultMapper() {
final ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JavaTimeModule());
return mapper;
}
}
在资源中注册jackson时,您需要添加以下Map器:
final ResourceConfig rc = new ResourceConfig().packages("<your package>");
rc
.register(JacksonObjectMapper.class)
.register(JacksonJaxbJsonProvider.class);
19条答案
按热度按时间pnwntuvh1#
这里不需要使用自定义序列化程序/反序列化程序。使用jackson-modules-java8的datetime模块:
数据类型模块,使jackson能够识别java8日期和时间api数据类型(jsr-310)。
此模块增加了对许多类的支持:
期间
瞬间
本地日期时间
本地日期
本地时间
月日
偏移日期时间
业余时间
期间
年
年月
分区日期
区域ID
区域偏移
gv8xihay2#
更新:出于历史原因留下这个答案,但我不建议这样做。请看上面接受的答案。
告诉jackson使用自定义[反]序列化类进行Map:
提供自定义类:
随机事实:如果我嵌套了上述类,并且没有使它们成为静态的,那么错误消息很奇怪:
org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'application/json;charset=UTF-8' not supported
zqdjd7g93#
如果您使用的是fasterxml的objectmapper类,默认情况下objectmapper不理解localdatetime类,因此,您需要在gradle/maven中添加另一个依赖项:
现在您需要将此库提供的数据类型支持注册到objectmapper对象中,这可以通过以下方法完成:
现在,在jsonstring中,您可以轻松地将java.localdatetime字段如下所示:
通过执行所有这些操作,json文件到java对象的转换将正常工作,您可以通过以下方式读取文件:
u0njafvf4#
此maven依赖项将解决您的问题:
我一直在努力的一件事是,对于zoneddatetime,在反序列化期间时区被更改为gmt。结果,默认情况下,jackson会用上下文中的一个替换它。。要保留区域1,必须禁用此“功能”
dtcbnfnu5#
我在使用SpringBoot时也遇到了类似的问题。使用spring boot 1.5.1.release,我所要做的就是添加依赖项:
wvt8vs2t6#
如果您使用的是jersey,则需要按照其他建议添加maven依赖项(jackson-datatype-jsr310),并注册对象Map器示例,如下所示:
在资源中注册jackson时,您需要添加以下Map器:
gt0wga4j7#
如果你不能使用
jackson-modules-java8
无论出于什么原因,您都可以将instant字段(反)序列化为long
使用@JsonIgnore
以及@JsonGetter
&@JsonSetter
:例子:
产量
kxeu7u2r8#
这只是一个例子,如何使用它在一个单元测试,我黑调试这个问题。关键成分是
mapper.registerModule(new JavaTimeModule());
maven依赖<artifactId>jackson-datatype-jsr310</artifactId>
代码:brjng4g39#
如果您使用的是jackson serializer,以下是使用日期模块的方法:
lb3vh1jj10#
我使用这种时间格式:
"{birthDate": "2018-05-24T13:56:13Z}"
将json反序列化为java.time.instant(参见屏幕截图)ykejflvf11#
你可以把这个放在你的房间里
application.yml
用于解析instant time(java8中的日期api)的文件:l7wslrjt12#
如果您使用的是spring boot,并且offsetdatetime有这个问题,那么需要使用registermodules,正如上面@greperor所回答的(5月28日16时13分04分回答),但是请注意有一个区别。不需要添加上面提到的依赖项,因为我猜spring boot已经有了它。我在springboot上遇到了这个问题,它在没有添加依赖项的情况下对我有效。
inkz8wg913#
如果您遇到这个问题是因为graphqljava工具和试图封送java
Instant
从日期字符串中,您需要设置schemaparser以使用具有特定配置的objectmapper:在graphqlschemabuilder类中,插入objectmapper并添加以下模块:
并将其添加到选项中:
看到了吗https://github.com/graphql-java-kickstart/graphql-spring-boot/issues/32
slmsl1lt14#
对于那些谁使用Spring Boot2.x
无需执行上述任何操作—Java8LocalDateTime是现成的序列化/反序列化。我必须在1.x中完成以上所有操作,但是在boot2.x中,它可以无缝地工作。
在springboot中也可以看到这个参考jsonjava8localdatetime格式
jfewjypa15#
如果任何人在使用时有问题
SpringBoot
下面是我如何在不添加新依赖项的情况下修复问题的。在
Spring 2.1.3
jackson期望日期字符串2019-05-21T07:37:11.000
在这个yyyy-MM-dd HH:mm:ss.SSS
要反序列化的格式LocalDateTime
. 确保日期字符串将日期和时间与T
不是和space
. 秒(ss
)和毫秒(SSS
)可能会被忽略。