jackson反序列化:Unexpected token (START_OBJECT), expected VALUE_STRING: Expected array or string.

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);

你可能感兴趣的:(json,jackson,json,Jackson,spring,boot)