跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • 请教大家 Jackson 泛型反序列化问题
未分類
13 10 月 2020

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

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

資深大佬 : sdbybyd 0

 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 类型识别不出来

大佬有話說 (17)

  • 資深大佬 : Cbdy

    用 type reference 试试?,参考这个
    https://github.com/cbdyzj/nano-bot/blob/master/common/src/main/java/nano/support/Json.java

  • 資深大佬 : xuanbg

    把 List<String>封装成一个对象

  • 資深大佬 : xuanbg

    @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);

  • 資深大佬 : xuanbg

    还是写错了……

    @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);

  • 資深大佬 : xuanbg

    好吧……

    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);

  • 資深大佬 : qwerthhusn

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

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

  • 資深大佬 : passerbytiny

    Class 类型的方法参数,实参只接受真实类型,不接受泛型。

  • 資深大佬 : 90d0n

    new TypeReference<Channel<Item>>() {}

  • 資深大佬 : qinxi

    @JsonTypeInfo
    @JsonSubTypes

  • 資深大佬 : 0x666666

    上说的对,遇到泛型统一 TypeReference 解决就完事了

  • 資深大佬 : GM

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

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

  • 主 資深大佬 : sdbybyd

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

  • 主 資深大佬 : sdbybyd

    @xuanbg 你这个是嵌套泛型的做法,但是仔细看下数据成员是泛型怎么搞呢?

  • 資深大佬 : Elroooo0Y

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

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

  • 主 資深大佬 : sdbybyd

    @qinxi 你这个是多态时的做法,不能用于复杂泛型吧

  • 資深大佬 : Elroooo0Y

    @Elroooo0Y

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

  • 主 資深大佬 : sdbybyd

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

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具