猿问

来自 JSON 路径结果的通用列表类型

我想基于作为参数传递的 Generic 类使用 POJO 序列化一些 JSON。


Generic 类应该扩展一个抽象类,以便我可以对结果数据结构调用一些常用方法。


到目前为止我有这个:


private <T extends TypeInterface> List<DBObject> getDataUsingJsonPath(String path, Class<T> type) {


    TypeRef<List<T>> typeRef = new TypeRef<List<T>>() {};


    Configuration configuration = Configuration

        .builder()

        .mappingProvider(new JacksonMappingProvider())

        .jsonProvider(new JacksonJsonProvider())

        .build();


    List<T> items = JsonPath.using(configuration).parse(jsonString).read(path, typeRef);


    result = items.getAggregations();

错误:


无法构造 TypeInterface 的实例,问题:抽象类型要么需要映射到具体类型,要么需要自定义反序列化器,要么使用附加类型信息进行实例化


我试图告诉它扩展了 TypeInterface,但实际的 Class 是“type”……我在这里错过了什么?


MYYA
浏览 296回答 3
3回答

茅侃侃

快速解决方案:private <T extends TypeInterface> List<DBObject> getDataUsingJsonPath(String path, Class<T> type) {&nbsp; &nbsp; Configuration configuration = Configuration&nbsp; &nbsp; &nbsp; &nbsp; .builder()&nbsp; &nbsp; &nbsp; &nbsp; .mappingProvider(new JacksonMappingProvider())&nbsp; &nbsp; &nbsp; &nbsp; .jsonProvider(new JacksonJsonProvider())&nbsp; &nbsp; &nbsp; &nbsp; .build();List<T> items = JsonPath.using(configuration).parse(jsonString).read(path, (Class<List<T>>) new ArrayList<T>().getClass());这个想法是摆脱TypeRef<List<T>>它的工作,但会产生警告。

慕雪6442864

编译器将编译new TypeRef<List<T>>() {};为对 的引用List<T extends TypeInterface>,而不是由 提供的元素类型type。看起来 JsonPath 不支持通过指定类来进一步细化 typeref。查看源代码,可以使用更扩展的库,如番石榴,并进行以下修改:TypeToken<T>像构建 guava一样构造 guava&nbsp;TypeRef<T>,但使用.where(new TypeParameter<T>() {}, type)将类型变量细化为最终类型。围绕新的 typetoken 创建一个包装器,为 JsonPath 提供精炼的类型:包装:class TokenRef<T> extends TypeRef<T> {&nbsp; &nbsp; private final TypeToken<T> token;&nbsp; &nbsp; public TokenRef(TypeToken<T> token) {&nbsp; &nbsp; &nbsp; &nbsp; super();&nbsp; &nbsp; &nbsp; &nbsp; this.token = token;&nbsp; &nbsp; }&nbsp; &nbsp; @Override&nbsp; &nbsp; public Type getType() {&nbsp; &nbsp; &nbsp; &nbsp; return this.token.getType();&nbsp; &nbsp; }}

繁花不似锦

这里有一些很好的答案,但是,经过一段时间的睡眠后,我选择将 TypeRef 移动为实际参数。private <T extends TypeInterface> List<DBObject> getDataUsingJsonPath(String path, TypeRef<List<T>> type) {然后我可以按预期迭代结果:List<T> items = JsonPath.using(configuration).parse(responseString).read(path, type);for(T item : items) {// do generic TypeInterface stuff here我不知道这是否是最好的、最正确的、“通用”的方法,但到目前为止很好,而且在阅读我认为的代码时基本上是有道理的。
随时随地看视频慕课网APP

相关分类

Java
我要回答