Java fasterxml.jackson反序列化LocalDateTime错误令牌异常 Java 1.8 弹簧靴1.5.8 faster.xml.jackson(jackson模块参数名称,jackson-datatype-jdk8,jackson-datatype-jsr310)2.9.2

Java fasterxml.jackson反序列化LocalDateTime错误令牌异常 Java 1.8 弹簧靴1.5.8 faster.xml.jackson(jackson模块参数名称,jackson-datatype-jdk8,jackson-datatype-jsr310)2.9.2,java,json,spring,deserialization,fasterxml,Java,Json,Spring,Deserialization,Fasterxml,我有一个带有时间戳的对象 @JsonProperty("timestamp") private LocalDateTime timestamp; 我需要反序列化的LocalDateTime戳记是: { "year":2017, "month":"OCTOBER", "dayOfMonth":27, "dayOfWeek":"FRIDAY", "dayOfYear":300, "monthValue":10, "nano":460000000,

我有一个带有时间戳的对象

@JsonProperty("timestamp")
private LocalDateTime timestamp;  
我需要反序列化的
LocalDateTime
戳记是:

{ 
   "year":2017,
   "month":"OCTOBER",
   "dayOfMonth":27,
   "dayOfWeek":"FRIDAY",
   "dayOfYear":300,
   "monthValue":10,
   "nano":460000000,
   "hour":4,
   "minute":47,
   "second":29,
   "chronology":{  
      "calendarType":"iso8601",
      "id":"ISO"
   }
}
我尝试使用以下命令反序列化对象:

MyObject myObject=
         new ObjectMapper()
             .findAndRegisterModules()
             .treeToValue(jsonPayload, MyObject.class);
应用程序在此调用时冻结,如果我中断调用,则会收到以下错误消息:

Error while stopping the container:
java.lang.NoSuchMethodError: com.fasterxml.jackson.databind.DeserializationContext.wrongTokenException(Lcom/fasterxml/jackson/core/JsonParser;Ljava/lang/Class;Lcom/fasterxml/jackson/core/JsonToken;Ljava/lang/String;)Lcom/fasterxml/jackson/databind/JsonMappingException;
        at com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer.deserialize(LocalDateTimeDeserializer.java:138) ~[jackson-datatype-jsr310-2.9.2.jar!/:2.9.2]
        at com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer.deserialize(LocalDateTimeDeserializer.java:39) ~[jackson-datatype-jsr310-2.9.2.jar!/:2.9.2]
        at com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:504) ~[jackson-databind-2.8.10.jar!/:2.8.10]
        at com.fasterxml.jackson.databind.deser.impl.FieldProperty.deserializeAndSet(FieldProperty.java:111) ~[jackson-databind-2.8.10.jar!/:2.8.10]
        at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:276) ~[jackson-databind-2.8.10.jar!/:2.8.10]
        at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:140) ~[jackson-databind-2.8.10.jar!/:2.8.10]
        at com.fasterxml.jackson.databind.ObjectMapper._readValue(ObjectMapper.java:3786) ~[jackson-databind-2.8.10.jar!/:2.8.10]
        at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2115) ~[jackson-databind-2.8.10.jar!/:2.8.10]
        at com.fasterxml.jackson.databind.ObjectMapper.treeToValue(ObjectMapper.java:2612) ~[jackson-databind-2.8.10.jar!/:2.8.10]
更新信息:

整个JSON是:

{"valid":true,"version":"0.0.1",
"timestamp":{"year":2017,"month":"OCTOBER","dayOfMonth":27,"dayOfWeek":"FRIDAY","dayOfYear":300,"monthValue":10,"nano":460000000,"hour":4,"minute":47,"second":29,"chronology":{"calendarType":"iso8601","id":"ISO"}},
"tenant":"stackoverflow","uid":"10fa132f-2c92-4fa5-bcc2-ee6023281503"})
序列化为:

String jsonString = new ObjectMapper().writeValueAsString(messageIndex);
对象属性:

@JsonProperty("version")
private String version;

@JsonProperty("timestamp")
private LocalDateTime timestamp;

@JsonProperty("tenant")
private String tenant;

@JsonProperty("dataSampleUid")
private UUID uid;

private boolean isValid;
LocalDateTime
设置为:

LocalDateTime.now()

序列化时,您没有注册任何模块,尤其是JavaTimeModule,因此LocalDateTime将像任何其他对象一样被序列化(打印所有可访问的字段)。但是,在反序列化部分,您注册了这个模块,并且他们希望LocalDateTime()具有特定的格式

如果要使其正常工作,只需更新序列化部分:

String jsonString = new ObjectMapper().findAndRegisterModules().writeValueAsString(messageIndex);
您应该通过应用程序重用相同的对象映射器,对于reader也是如此。这两个原因都是因为线程安全和实例相对较轻

运行这个程序,您将看到它工作正常,并且您将看到LocalDateTime序列化值的差异

ObjectMapper mapper = new ObjectMapper().findAndRegisterModules();
MyObject data = new MyObject();
data.setTimestamp(LocalDateTime.now());
String result = mapper.writeValueAsString(data);
System.out.println(result);
JsonNode tree = mapper.reader().readTree(result);
mapper.treeToValue(tree, MyObject.class);

有没有理由使用treeToValue?为什么不使用jsonMapper.readValue(对象,类)?通过JsonNode可以验证模式。我用readValue试过了,没有变化。问题是,反序列化程序在LocalDateTime上遇到了问题,请参见错误片段的第3行和第4行。我只是好奇,您能否将您的jackson依赖项,特别是jackson-datatype-jsr310从版本2.9.2恢复到早期版本,例如2.8.10?我编写了一个小测试,其中一个POJO包含一个时间戳。与您的JSOn不同的是,当我序列化它时,JSOn看起来像{“timestamp”:[2017,10,27,8,22]},而不是您的看起来太冗长。也许您只需要检查序列化方面并对其进行一点调整。LocalDateTime的json表示不是JavaTimeModule处理它的方式。序列化的LocalDateTime看起来像对象的默认序列化(对象的所有可访问字段)。你能告诉我们你是如何序列化的吗?但是,当您反序列化它时,您注册了JavaTimeModule,因此期望数组(如@mrkernelpanic所说)不会发生任何更改。我添加了一个快速运行示例,您将看到。您是对的,我在构建之前完成了完整的清理,现在一切都正常了!非常感谢!