使用jackson jsonMap器序列化/反序列化java 8 java.time

nimxete2  于 2021-07-16  发布在  Java
关注(0)|答案(19)|浏览(734)

如何将jackson jsonMap器与java8 localdatetime结合使用?
org.codehaus.jackson.map.jsonmappingexception:无法从json字符串示例化类型[simple type,class java.time.localdatetime]的值;没有单个字符串构造函数/工厂方法(通过引用链:mydto[“field1”]->subdto[“date”])

dtcbnfnu

dtcbnfnu16#

我在使用SpringBoot时也遇到了类似的问题。使用spring boot 1.5.1.release,我所要做的就是添加依赖项:

<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jsr310</artifactId>
</dependency>
u0njafvf

u0njafvf17#

此maven依赖项将解决您的问题:

<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jsr310</artifactId>
    <version>2.6.5</version>
</dependency>

我一直在努力的一件事是,对于zoneddatetime,在反序列化期间时区被更改为gmt。结果,默认情况下,jackson会用上下文中的一个替换它。。要保留区域1,必须禁用此“功能”

Jackson2ObjectMapperBuilder.json()
    .featuresToDisable(DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE)
zqdjd7g9

zqdjd7g918#

如果您使用的是fasterxml的objectmapper类,默认情况下objectmapper不理解localdatetime类,因此,您需要在gradle/maven中添加另一个依赖项:

compile 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.7.3'

现在您需要将此库提供的数据类型支持注册到objectmapper对象中,这可以通过以下方法完成:

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.findAndRegisterModules();

现在,在jsonstring中,您可以轻松地将java.localdatetime字段如下所示:

{
    "user_id": 1,
    "score": 9,
    "date_time": "2016-05-28T17:39:44.937"
}

通过执行所有这些操作,json文件到java对象的转换将正常工作,您可以通过以下方式读取文件:

objectMapper.readValue(jsonString, new TypeReference<List<User>>() {
            });
gv8xihay

gv8xihay19#

更新:出于历史原因留下这个答案,但我不建议这样做。请看上面接受的答案。
告诉jackson使用自定义[反]序列化类进行Map:

@JsonSerialize(using = LocalDateTimeSerializer.class)
@JsonDeserialize(using = LocalDateTimeDeserializer.class)
private LocalDateTime ignoreUntil;

提供自定义类:

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

相关问题