为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

MYYA 2022-01-06 19:48:37
我想基于作为参数传递的 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”……我在这里错过了什么?
查看完整描述

3 回答

?
茅侃侃

TA贡献1842条经验 获得超21个赞

快速解决方案:


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


    Configuration configuration = Configuration

        .builder()

        .mappingProvider(new JacksonMappingProvider())

        .jsonProvider(new JacksonJsonProvider())

        .build();


List<T> items = JsonPath.using(configuration).parse(jsonString).read(path, (Class<List<T>>) new ArrayList<T>().getClass());

这个想法是摆脱TypeRef<List<T>>它的工作,但会产生警告。


查看完整回答
反对 回复 2022-01-06
?
慕雪6442864

TA贡献1812条经验 获得超5个赞

编译器将编译new TypeRef<List<T>>() {};为对 的引用List<T extends TypeInterface>,而不是由 提供的元素类型type

看起来 JsonPath 不支持通过指定类来进一步细化 typeref。查看源代码,可以使用更扩展的库,如番石榴,并进行以下修改:

  1. TypeToken<T>像构建 guava一样构造 guava TypeRef<T>,但使用.where(new TypeParameter<T>() {}, type)将类型变量细化为最终类型。

  2. 围绕新的 typetoken 创建一个包装器,为 JsonPath 提供精炼的类型:

包装:

class TokenRef<T> extends TypeRef<T> {

    private final TypeToken<T> token;


    public TokenRef(TypeToken<T> token) {

        super();

        this.token = token;

    }


    @Override

    public Type getType() {

        return this.token.getType();

    }

}


查看完整回答
反对 回复 2022-01-06
?
繁花不似锦

TA贡献1851条经验 获得超4个赞

这里有一些很好的答案,但是,经过一段时间的睡眠后,我选择将 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

我不知道这是否是最好的、最正确的、“通用”的方法,但到目前为止很好,而且在阅读我认为的代码时基本上是有道理的。


查看完整回答
反对 回复 2022-01-06
  • 3 回答
  • 0 关注
  • 295 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信