jackson 反序列化范型

进行范型序列化不能使用Class,需要自定义TypeRef

jackson默认的反序列化方法是: JsonSmartMappingProvider

里面直接声明了不支持自定义类型序列化:

所以要解决问题,首先要找到支持范型的反序列化器,上面异常信息里有提示:使用jackson或Gson的基础提供者。可以在方法的实现里找到:

 进去查看之后只有上面标识的两个发序列化器里有实现方式,所以尝试使用 JacksonMappingProvider 进行处理,具体实现如下:

TypeRef<List<Long>> typeRef = new TypeRef<List<Long>>(){};
final ObjectMapper mapper = new ObjectMapper();
List<Long> read = JsonPath
                .using(Configuration.builder().mappingProvider(new JacksonMappingProvider(mapper)).build())
                .parse(s)
                .read("$..marketPrice", typeRef);

使用 GsonMappingProvider 稍有不同,实现如下:

JsonElement jsonElement = JsonParser.parseString(s);
List<Long> read = JsonPath
                .using(Configuration.builder()
                .jsonProvider(new GsonJsonProvider())
                .mappingProvider(new GsonMappingProvider()).build())
                .parse(jsonElement)
                .read("$..marketPrice", typeRef);

需要把json串转换成 JsonElement,同时需要配置jsonProvider,原因如下:

这里源码中的实现对需要反编译的对象做了强转,如果不是JsonElement的子类会报转换异常 。

 需要配置JsonProvider的原因如上,需要用  GsonJsonProvider 中的实现来进行判断。如果不设置这个解析器,默认会用 JsonSmartJsonProvider ,这个解析器里没有实现isMap()和isArray(),默认用父类的如下:

由于从JsonPath传入的是转换过的JsonElement对象,所以在转换过程中直接转成JsonArray类型,导致使用默认Provider判断为false,使用Gson实现的就会兼容JsonArray类型,判断为true,后面正常对对象进行反序列化。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值