【问题标题】:How to use Jackson with nested Generics?如何将 Jackson 与嵌套泛型一起使用?
【发布时间】:2016-05-05 07:17:45
【问题描述】:

我用的是 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。 当它是一个列表时,即使我使用 TypeReference,jackson 也只是将数据转换为 LinkedHashMap: Json 字符串是:

 {"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;
}

我看到这个问题,How to use Jackson with Generics,当我不嵌套泛型时一切都很好,但是当泛型嵌套时我该怎么办?

【问题讨论】:

    标签: java android json jackson


    【解决方案1】:

    首先你应该将Result设为静态(more info)或将其移出QuotationHttpResult,这样jackson就可以看到data类型。因此,您必须将其设为通用 Result&lt;T&gt;。您还必须将 getter 和 setter 添加到您的 MyClass POJO 或为 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);
    }
    

    【讨论】:

    • 这里的data 字段不会是MyClass 类型。它将是 ArrayList 打破所有类型安全。
    【解决方案2】:

    你可以试试Custom Deserializer for Jackson。我认为这是解决有问题的反序列化的最佳方法...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-12
      • 2016-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-02
      相关资源
      最近更新 更多