java通用响应为Json
我正在努力反序列化由通用结果结构包装的JSON
对象:
我的JSON
来自服务器:
{
"totalsize": 5,
"data" : [
{"name":1},
{"name":2}
]
}
结果中的MyJava
对象:
public class ResponseTo<T> {
public Long totalsize = null;
public final List<T> data = new ArrayList<>();
}
在这种情况下(可能是其他GET请求中的任何内容)
public class Item {
public int name;
}
在这种情况下T
是Item
如何将JSON
有效负载反序列化到此对象结构中:
GSON
和/或com.fasterxml.jackson
我想要一个静态方法,如:
public static <T> ResponseTo<T> stringToObject(String jsonString, Class<T> clazz ) {
final Gson gson = new Gson();
// do some typeadapter function magic
return gson.fromJson( jsonString, ResponseTo.class );
}
由
ResponseTo<Item> responseTo = stringToObject( <json-string>, Item.class );
我只接收com.google.gson.internal.LinkedTreeMap
作为数据对象
我能做些什么使它工作我是不是走错了路
# 1 楼答案
如果对象中有一个类型鉴别器(即,每个示例中都有一个具有唯一值的公共字段),那么Jackson
@JsonTypeInfo(JsonTypeInfo.As.EXISTING_PROPERTY...)
将允许您定义查找的位置,并且初始化可以使用ObjectMapper.registerSubtypes(Item.class)
预注册所有可能的类。然后杰克逊会选择正确的如果实例化哪种类型的规则比“look in field X”更复杂,那么您必须编写自己的
@JsonTypeResolver
来实现所述逻辑(非常重要)# 2 楼答案
您需要使用类型标记来处理泛型情况,因为Java编译器将删除
T
的类型信息,而Gson不知道将T
还原到什么类型# 3 楼答案
格森
您可以使用内部
com.google.gson.internal.$Gson$Types
类来实现这一点:以上代码打印:
杰克逊
在
Jackson
中,您可以使用类似的方法: