[英]How to use Jackson with nested Generics?
我使用Retrofit和Jackson。有一個像這樣的POJO:
public class QuotationHttpResult<T> {
private int code;
private Result result;
public T getData(){
return result == null ? null : result.getData();
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public Result getResult() {
return result;
}
public void setResult(Result result) {
this.result = result;
}
class Result{
private T data;
public T getData() {
return data;
}
}
}
提交的數據是我需要的,有時是POJO,有時候是List。 當它是一個列表時,jackson只是將數據轉換為LinkedHashMap,即使我使用TypeReference:Json String是:
{"code": 0,
"result": {
"data": [
{
"id": "1000",
"name": "tecent"
},
{
"id": "1001",
"name": "alibaba"
}
]
}
}
轉換代碼:
ObjectMapper mapper = new ObjectMapper();
QuotationHttpResult<List<MyClass>> result = mapper.readValue(json,new TypeReference<QuotationHttpResult<List<MyClass>>>() {});
MyClass很簡單:
class MyClass{
String id;
String name;
}
我看到這個問題, 如何使用Generics中的Jackson,當我不嵌套泛型時一切順利,但是當嵌套泛型時我該怎么辦?
首先你應該使Result
靜態( 更多信息 )或將其移出QuotationHttpResult
,這樣jackson可以看到它的data
類型。 因此,您必須使其成為通用Result<T>
。 你還必須在你的MyClass
POJO中添加getter和setter,或者為jackson添加注釋。
這是演示:
public class QuotationHttpResult<T> {
private int code;
private Result<T> result;
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public Result<T> getResult() {
return result;
}
public void setResult(Result<T> result) {
this.result = result;
}
public static class Result<T>{
private T data;
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
}
}
public class MyClass {
private String id;
private String name;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public static void main(String[] args) throws IOException {
String json = " {\"code\": 0,\n" +
" \"result\": {\n" +
" \"data\": [\n" +
" {\n" +
" \"id\": \"1000\",\n" +
" \"name\": \"tecent\"\n" +
" }, \n" +
" {\n" +
" \"id\": \"1001\",\n" +
" \"name\": \"alibaba\"\n" +
" }\n" +
" ]\n" +
" }\n" +
" }";
ObjectMapper mapper = new ObjectMapper();
QuotationHttpResult<MyClass> result = mapper.readValue(json,new TypeReference<QuotationHttpResult<List<MyClass>>>() {});
System.out.println(result);
}
您可以嘗試使用Custom Deserializer for Jackson 。 我認為這是有問題的反序列化的最佳方式......
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.