请教大家 Jackson 泛型反序列化问题


class R<T> {
  private T data;
}

class Item {
  private R<List<String>> message;
}

class Channel<T> {
  private T data;
}

Channel<Item> i ???

请教下最后一个 Channel<Item> 要怎么反序列化呢?


            JavaType type = mapper.getTypeFactory()
                    .constructParametricType(
                            Channel.class,
                            Item.class);
            Channel<Item> body = mapper.readValue(str, type);

这样做的话报错,R 类型识别不出来

Click to rate this post!
[Total: 0 Average: 0]

相关文章

16 thoughts on “请教大家 Jackson 泛型反序列化问题

  1. @xuanbg 看错题目了,你这个泛型嵌套,获取 type 也要嵌套啊,哪能一下子就得到完整的类型呢。试试看下面的代码
    JavaType r = mapper.getTypeFactory().constructParametricType(R.class, String.class);
    JavaType i = mapper.getTypeFactory().constructParametricType(Item.class, r);
    JavaType c = mapper.getTypeFactory().constructParametricType(Channel.class, i);

    Channel<Item> body = mapper.readValue(str, c);

  2. 还是写错了……

    @xuanbg 看错题目了,你这个泛型嵌套,获取 type 也要嵌套啊,哪能一下子就得到完整的类型呢。试试看下面的代码
    JavaType r = mapper.getTypeFactory().constructParametricType(List.class, String.class);
    JavaType i = mapper.getTypeFactory().constructParametricType(Item.class, r);
    JavaType c = mapper.getTypeFactory().constructParametricType(Channel.class, i);

    Channel<Item> body = mapper.readValue(str, c);

  3. 好吧……

    JavaType list = mapper.getTypeFactory().constructParametricType(List.class, String.class);
    JavaType r = mapper.getTypeFactory().constructParametricType(R.class, list);
    JavaType item = mapper.getTypeFactory().constructParametricType(Item.class, r);
    JavaType channel = mapper.getTypeFactory().constructParametricType(Channel.class, i);

  4. mapper.readValue(str, new TypeReference<Channel<Item>>() {});
    就行了

    Item 里面的泛型 Jackson 能取到的,你不用关心

  5. 两个方法:
    一个是楼上说的 new TypeReference<Channel<Item>>() {}
    第二个,简单粗暴,直接定义一个类:
    public static class ChannelItem extends Channel<Item> {}

    后续所有序列化、反序列化都用这个 ChannelItem

  6. @Cbdy @90d0n @GM TypeReference 只能推断顶层类型,会报错,数据成员泛型怎么推断呢?

  7. item 上面不加泛型
    自己的都不知道 R 的具体类型是什么
    jackson 怎么会知道呢 .

    如果 R 不能表示出来的话 可以在 json 字符里面试试 “class”关键字表示一下具体的泛型类型

  8. @Elroooo0Y

    这么写
    {
    “condition”: {
    “class”: “com.github.Test”,
    “id”: {
    “uid”: 1000
    },
    “source”: 1
    }
    }

  9. 统一回复,使用 JsonNode 临时解决了,不能推断的泛型字段单独读取 string 出来后再重新反序列化(这时 JavaType 或 TypeReference 都可以)

发表回复

您的电子邮箱地址不会被公开。