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 类型识别不出来
1
Cbdy 2020-10-13 06:58:49 +08:00 via Android
用 type reference 试试?,参考这个
https://github.com/cbdyzj/nano-bot/blob/master/common/src/main/java/nano/support/Json.java |
2
xuanbg 2020-10-13 07:14:23 +08:00
把 List<String>封装成一个对象
|
3
xuanbg 2020-10-13 07:50:14 +08:00
@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); |
4
xuanbg 2020-10-13 07:51:50 +08:00
还是写错了……
@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); |
5
xuanbg 2020-10-13 07:54:15 +08:00
好吧……
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); |
6
qwerthhusn 2020-10-13 09:02:13 +08:00
mapper.readValue(str, new TypeReference<Channel<Item>>() {});
就行了 Item 里面的泛型 Jackson 能取到的,你不用关心 |
7
passerbytiny 2020-10-13 09:12:00 +08:00 via Android
Class 类型的方法参数,实参只接受真实类型,不接受泛型。
|
8
90d0n 2020-10-13 09:17:57 +08:00
new TypeReference<Channel<Item>>() {}
|
9
qinxi 2020-10-13 09:30:16 +08:00
|
10
0x666666 2020-10-13 09:57:12 +08:00
楼上说的对,遇到泛型统一 TypeReference 解决就完事了
|
11
GM 2020-10-13 09:58:15 +08:00
两个方法:
一个是楼上说的 new TypeReference<Channel<Item>>() {} 第二个,简单粗暴,直接定义一个类: public static class ChannelItem extends Channel<Item> {} 后续所有序列化、反序列化都用这个 ChannelItem |
14
Elroooo0Y 2020-10-13 11:32:38 +08:00
item 上面不加泛型
自己的都不知道 R 的具体类型是什么 jackson 怎么会知道呢 . 如果 R 不能表示出来的话 可以在 json 字符里面试试 "class"关键字表示一下具体的泛型类型 |
16
Elroooo0Y 2020-10-13 11:42:18 +08:00
|
17
sdbybyd OP 统一回复,使用 JsonNode 临时解决了,不能推断的泛型字段单独读取 string 出来后再重新反序列化(这时 JavaType 或 TypeReference 都可以)
|