簡體   English   中英

如何使用嵌套泛型的傑克遜?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM