首页 > 技术文章 > jackson反序列化:Unexpected token (START_OBJECT), expected VALUE_STRING: Expected array or string.

ziyue7575 2020-10-05 04:27 原文

jackson反序列化问题

今天在将jackson转为的字符串重新转回对象的时候,异常了
Unexpected token (START_OBJECT), expected VALUE_STRING: Expected array or string.

看下面一行,说是其中一个字段转换失败 private LocalDateTime createTime;
开始以为是jackson配置的原因:https://www.cnblogs.com/niceboat/p/7284099.html
试了之后发现无效,就看了一下jackson之前序列化的字符串,发现 createTime转换的内容有点不对劲

"createTime": {
"year": 2020,
"monthValue": 3,
"month": "MARCH",
"dayOfMonth": 24,
"dayOfYear": 84,
"dayOfWeek": "TUESDAY",
"hour": 17,
"minute": 52,
"second": 31,
"nano": 0,
"chronology": { "calendarType": "iso8601", "id": "ISO" }
},

这什么鬼格式啊,明明返回给前端的时候不是这个样子的,是很正常的时间格式 2020-03-24 17:52:31

研究之后发现,我的框架是SpringBoot,其中集成的jackson已经被我配置了关于LocalDateTime 的处理,所以接口返回前端的时候没有问题;但是项目中使用的时候,在序列化的时候是new ObjectMapper()的,SpringBoot中的配置和新创建的不一样,所以在序列化和反序列化的时候,对LocalDateTime 的处理完全不一样导致的转换失败

解决方法

统一序列化、反序列化的方法,要么全部使用新创建的ObjectMapper,要么使用SpringBoot中配置了的(建议使用SpringBoot中的,毕竟一些配置还是很有必要的)

  • 使用SpringBoot中的
@Autowired
private ObjectMapper objectMapper;
//若是在工具类中,这个类需要添加 @Component ,使其能够被spring检测到

或者获取bean

ApplicationContext ac2 = WebApplicationContextUtils.getWebApplicationContext(ServletContext sc);
private static ObjectMapper objectMapper = ac1.getBean("objectMapper",ObjectMapper.class);

推荐阅读