首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Jackson序列化/反序列化java 8 java.time

用Jackson序列化/反序列化java 8 java.time
EN

Stack Overflow用户
提问于 2015-01-14 21:08:29
回答 24查看 513.1K关注 0票数 322

如何在Java8 LocalDateTime中使用Jackson映射器?

org.codehaus.jackson.map.JsonMappingException:不能实例化来自JSON字符串的简单类型、类java.time.LocalDateTime的值;没有单字符串构造函数/工厂方法(通过引用链: MyDTO"field1"->SubDTO"date")

EN

回答 24

Stack Overflow用户

回答已采纳

发布于 2015-01-14 21:12:14

这里不需要使用自定义序列化器/反序列化器。使用jackson-模块-java8 8的日期时间模块

Datatype模块,使Jackson能够识别Java 8日期和时间API数据类型(JSR-310)。

这个模块增加了对很多类的支持:

  • 持续时间
  • 速溶
  • LocalDateTime
  • LocalDate
  • LocalTime
  • MonthDay
  • OffsetDateTime
  • OffsetTime
  • 句号
  • YearMonth
  • ZonedDateTime
  • ZoneId
  • ZoneOffset
票数 358
EN

Stack Overflow用户

发布于 2015-01-14 21:08:29

更新:出于历史原因离开这个答案,但我不推荐它。请参阅上述已获接纳的答案。

告诉Jackson使用自定义反序列化类映射:

代码语言:javascript
复制
@JsonSerialize(using = LocalDateTimeSerializer.class)
@JsonDeserialize(using = LocalDateTimeDeserializer.class)
private LocalDateTime ignoreUntil;

提供自定义类:

代码语言:javascript
复制
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

票数 100
EN

Stack Overflow用户

发布于 2016-05-28 13:04:20

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

代码语言:javascript
复制
compile 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.7.3'

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

代码语言:javascript
复制
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.findAndRegisterModules();

现在,在您的jsonString中,您可以轻松地将您的java.LocalDateTime字段放在下面的位置:

代码语言:javascript
复制
{
    "user_id": 1,
    "score": 9,
    "date_time": "2016-05-28T17:39:44.937"
}

通过这样做,您的Json文件到Java对象的转换将正常工作,您可以通过以下方式读取该文件:

代码语言:javascript
复制
objectMapper.readValue(jsonString, new TypeReference<List<User>>() {
            });
票数 97
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27952472

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档