【发布时间】:2021-07-13 20:25:17
【问题描述】:
我有一个主课:
@NoArgsConstructor
@AllArgsConstructor
@Data
@Builder
public class ContentModel implements Serializable {
@JsonProperty("serviceData")
private ServiceData serviceData;
}
和嵌套类:
@NoArgsConstructor
@AllArgsConstructor
@Data
@Builder
public class ServiceData implements Serializable {
@JsonProperty ("dateTimeMessageSend")
private LocalDateTime dateTimeMessageSend;
}
我正在尝试通过使用自定义反序列化器来反序列化:
public class LocalDateTimeDeserializer extends StdDeserializer<LocalDateTime> {
private static final long serialVersionUID = 1L;
protected LocalDateTimeDeserializer() {
super(LocalDateTime.class);
}
@Override
public LocalDateTime deserialize(final JsonParser jp, final DeserializationContext ctxt)
throws IOException {
return LocalDateTime.parse(jp.readValueAs(String.class));
}
}
这就是我如何配置我的 objectMapper:
JavaTimeModule javaTimeModule = new JavaTimeModule();
javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer());
this.objectMapper.registerModule(javaTimeModule);
this.objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
this.objectMapper.registerModule(new Jdk8Module());
this.objectMapper.findAndRegisterModules();
应用程序在以下 json 之外接收:
{
"serviceData": {
"dateTimeMessageSend": {
"month": "APRIL",
"dayOfYear": 109,
"dayOfWeek": "MONDAY",
"nano": 183251000,
"year": 2021,
"monthValue": 4,
"dayOfMonth": 19,
"hour": 14,
"minute": 52,
"second": 44,
"chronology": {
"calendarType": "iso8601",
"id": "ISO"
}
},
}
}
在 LocalDateTime 反序列化时,我收到异常:
MismatchedInputException: Cannot deserialize instance of `java.lang.String` out of START_OBJECT token
我想,jackson 将“dateTimeMessageSend”识别为一个对象并且无法将其解析为字符串。
解决问题的方法是什么?
- 修改源 json,例如将 LocalDateFormat 更改为 String。 (什么是不受欢迎的)
- objectMapper 或/和 LocalDateTimeDeserializer 的进一步自定义
【问题讨论】:
-
如果您收到 那个 JSON,那么发件人没有注册
JavaTimeModule。强烈建议修复发件人。如果您无法修复发件人,则需要一个 custom 反序列化程序,该反序列化程序使用LocalDateTime.of(int year, int month, int dayOfMonth, int hour, int minute, int second, int nanoOfSecond)方法从该 JSON 对象数据中实例化LocalDateTime。 -
安德烈亚斯,有些事情正在变得清晰起来。但是您所说的“发件人已修复”是什么意思?
-
该 JSON 的发送者不应该这样构建它。应该是
"dateTimeMessageSend": "2021-04-19T14:52:44.183251"。 如果可能,需要修复发送代码才能做到这一点。然后在您端(接收端)解析将正常工作,无需自定义反序列化器。 -
是的,安德烈亚斯。我在发送者对象映射器 JavaTimeModule 中注册。问题就解决了。
标签: java jackson deserialization localdatetime