猿问

使用Jackson JSON映射器序列化/反序列化java 8 java.time

使用Jackson JSON映射器序列化/反序列化java 8 java.time

如何将Jackson JSON映射器与Java 8 LocalDateTime一起使用?

org.codehaus.jackson.map.JsonMappingException:无法从JSON String实例化类型[simple type,class java.time.LocalDateTime]的值; 没有单字符串构造函数/工厂方法(通过引用链:MyDTO [“field1”] - > SubDTO [“date”])


开满天机
浏览 1638回答 3
3回答

蛊毒传说

这里不需要使用自定义序列化器/反序列化器。使用jackson-modules-java8的datetime模块:数据类型模块使Jackson能够识别Java 8 Date&Time API数据类型(JSR-310)。该模块增加了对很多类的支持:持续时间瞬间LocalDateTimeLOCALDATE的当地时间月日OffsetDateTimeOffsetTime期年YearMonthZonedDateTime了zoneidZoneOffset

拉莫斯之舞

由于历史原因留下这个答案,但我不推荐它。请参阅上面接受的答案。告诉Jackson使用您的自定义[de]序列化类进行映射:@JsonSerialize(using&nbsp;=&nbsp;LocalDateTimeSerializer.class)@JsonDeserialize(using&nbsp;=&nbsp;LocalDateTimeDeserializer.class)private&nbsp;LocalDateTime&nbsp;ignoreUntil;提供自定义类:public&nbsp;class&nbsp;LocalDateTimeSerializer&nbsp;extends&nbsp;JsonSerializer<LocalDateTime>&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;@Override &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;serialize(LocalDateTime&nbsp;arg0,&nbsp;JsonGenerator&nbsp;arg1,&nbsp;SerializerProvider&nbsp;arg2)&nbsp;throws&nbsp;IOException&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;arg1.writeString(arg0.toString()); &nbsp;&nbsp;&nbsp;&nbsp;}}public&nbsp;class&nbsp;LocalDateTimeDeserializer&nbsp;extends&nbsp;JsonDeserializer<LocalDateTime>&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;@Override &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;LocalDateTime&nbsp;deserialize(JsonParser&nbsp;arg0,&nbsp;DeserializationContext&nbsp;arg1)&nbsp;throws&nbsp;IOException&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;LocalDateTime.parse(arg0.getText()); &nbsp;&nbsp;&nbsp;&nbsp;}}随机事实:如果我在类之上嵌套并且不使它们静态,则错误消息很奇怪:&nbsp;org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'application/json;charset=UTF-8' not supported

月关宝盒

如果您使用的是fastxml的ObjectMapper类,默认情况下ObjectMapper不了解LocalDateTime类,因此,您需要在gradle / maven中添加另一个依赖项:compile&nbsp;'com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.7.3'现在您需要将此库提供的数据类型支持注册到objectmapper对象,这可以通过以下方式完成:ObjectMapper&nbsp;objectMapper&nbsp;=&nbsp;new&nbsp;ObjectMapper();objectMapper.findAndRegisterModules();现在,在您的jsonString中,您可以轻松地将java.LocalDateTime字段设置如下:{ &nbsp;&nbsp;&nbsp;&nbsp;"user_id":&nbsp;1, &nbsp;&nbsp;&nbsp;&nbsp;"score":&nbsp;9, &nbsp;&nbsp;&nbsp;&nbsp;"date_time":&nbsp;"2016-05-28T17:39:44.937"}通过这一切,您的Json文件到Java对象转换将正常工作,您可以通过以下方式读取该文件:objectMapper.readValue(jsonString,&nbsp;new&nbsp;TypeReference<List<User>>()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});
随时随地看视频慕课网APP
我要回答