jackson反序列化失败InvalidFormatException: Can not deserialize value of type java.util.Date

灰太狼 2022-04-02 04:22 593阅读 0赞

问题:

客户端使用fastjson进行序列化,服务端使用jackson反序列化失败。报错。

  1. Caused by: com.fasterxml.jackson.databind.exc.InvalidFormatException: Can not deserialize value of type java.util.Date from String "2018-12-25 10:07:49": not a valid representation (error: Failed to parse Date value '2018-12-25 10:07:49': Can not parse date "2018-12-25 10:07:49Z": while it seems to fit format 'yyyy-MM-dd'T'HH:mm:ss.SSS'Z'', parsing fails (leniency? null))
  2. at [Source: {"acctBal":9797.11,"acctDate":"22222","acctName":"22222","acctNo":"xxxxxxxxxxxx","cretDebtFlag":"22222","currencyCode":"22222","insSeq":"22222","merId":"22222","merName":"22222","othAcctName":"22222","othAcctNo":"22222","othBankNo":"22222","remark":"22222","reqReserved":"22222","reserved":"22222","rtnReason":"22222","successtime":"2018-12-25 10:07:49","txnAmt":753375.33,"txnDate":"22222","txnNo":"22222","txnType":"22222"}; line: 1, column: 333] (through reference chain: com.baofoo.cgwfi.ws.wsdto.account.DownloadFileLzDetailDTO["successtime"])
  3. at com.fasterxml.jackson.databind.exc.InvalidFormatException.from(InvalidFormatException.java:74)
  4. at com.fasterxml.jackson.databind.DeserializationContext.weirdStringException(DeserializationContext.java:1410)
  5. at com.fasterxml.jackson.databind.DeserializationContext.handleWeirdStringValue(DeserializationContext.java:926)
  6. at com.fasterxml.jackson.databind.deser.std.StdDeserializer._parseDate(StdDeserializer.java:819)
  7. at com.fasterxml.jackson.databind.deser.std.StdDeserializer._parseDate(StdDeserializer.java:788)
  8. at com.fasterxml.jackson.databind.deser.std.DateDeserializers$DateBasedDeserializer._parseDate(DateDeserializers.java:172)
  9. at com.fasterxml.jackson.databind.deser.std.DateDeserializers$DateDeserializer.deserialize(DateDeserializers.java:259)
  10. at com.fasterxml.jackson.databind.deser.std.DateDeserializers$DateDeserializer.deserialize(DateDeserializers.java:242)
  11. at com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:504)
  12. at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:104)
  13. at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:276)
  14. at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:140)
  15. at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3798)
  16. at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2842)
  17. at com.baofoo.util.json.JsonCodingUtil.decode(JsonCodingUtil.java:45)
  18. ... 68 more

原因

fastjson默认使用的序列化格式:

  1. public static String DEFFAULT_DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";

jackson默认支持的日期反序列格式:

  1. ("yyyy-MM-dd'T'HH:mm:ss.SSSZ", "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", "EEE, dd MMM yyyy HH:mm:ss zzz", "yyyy-MM-dd"))

jackson默认的日期反序列化不支持yyyy-MM-dd HH:mm:ss 这种格式,所以反序列化失败
解决办法一:重写jackson反序列化

  1. import com.fasterxml.jackson.core.JsonParser;
  2. import com.fasterxml.jackson.core.JsonProcessingException;
  3. import com.fasterxml.jackson.databind.DeserializationContext;
  4. import com.fasterxml.jackson.databind.JsonDeserializer;
  5. import java.io.IOException;
  6. import java.text.ParseException;
  7. import java.text.SimpleDateFormat;
  8. import java.util.Date;
  9. /**
  10. * @version 1.0.0
  11. * @description 重写反序列化
  12. * @date 2018/12/25 9:51
  13. **/
  14. public class CustomJsonDateDeserializer extends JsonDeserializer<Date> {
  15. @Override
  16. public Date deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {
  17. SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  18. String date = jp.getText();
  19. try {
  20. return format.parse(date);
  21. } catch (ParseException e) {
  22. throw new RuntimeException(e);
  23. }
  24. }
  25. }

在需要的date属性上添加注解:

  1. @JsonDeserialize(using = CustomJsonDateDeserializer.class)
  2. private Date txnTime;
  3. 使用这种方式,需要重写上面反序列化抽象类

解决办法二:直接使用jackson注解,不需要重写反序列化

  1. @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
  2. private Date txnTime;

GMT+8表示时区,东八区

解决办法三:直接使用fastjson注解,不要重写反序列化
@JSONField(format = “yyyy-MM-dd HH:mm:ss”)
private Date txnTime;

添加依赖:

  1. <!-- fastjson -->
  2. <dependency>
  3. <groupId>com.alibaba</groupId>
  4. <artifactId>fastjson</artifactId>
  5. <version>1.2.32</version>
  6. </dependency>
  7. <!-- jackson-->
  8. <dependency>
  9. <groupId>com.fasterxml.jackson.core</groupId>
  10. <artifactId>jackson-databind</artifactId>
  11. <version>2.6.4</version>
  12. </dependency>

发表评论

表情:
评论列表 (有 0 条评论,593人围观)

还没有评论,来说两句吧...

相关阅读