进行范型序列化不能使用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,后面正常对对象进行反序列化。