Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将Jackson与嵌套泛型一起使用?_Java_Android_Json_Jackson - Fatal编程技术网

Java 如何将Jackson与嵌套泛型一起使用?

Java 如何将Jackson与嵌套泛型一起使用?,java,android,json,jackson,Java,Android,Json,Jackson,我使用改装和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 c

我使用改装和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;
        }
    }
} 
转换代码:

ObjectMapper mapper = new ObjectMapper();
QuotationHttpResult<List<MyClass>> result = mapper.readValue(json,new TypeReference<QuotationHttpResult<List<MyClass>>>() {});

我看到了这个问题,当我不嵌套泛型时,一切都很顺利,但是当泛型嵌套时,我该怎么做呢?

您可以尝试使用。我认为这是有问题的反序列化的最佳方式…

首先,您应该使
结果
静态()或将其移出
QuotationHttpResult
,以便jackson可以看到
数据类型。因此,您必须使其成为通用的
Result
。您还必须向
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);
}
public类QuotationHttpResult{
私有整数码;
私人结果;
公共int getCode(){
返回码;
}
公共无效设置码(整数码){
this.code=代码;
}
公共结果getResult(){
返回结果;
}
公共void setResult(结果){
this.result=结果;
}
公共静态类结果{
私有T数据;
公共T getData(){
返回数据;
}
公共无效设置数据(T数据){
这个数据=数据;
}
}
}
公共类MyClass{
私有字符串id;
私有字符串名称;
公共字符串getId(){
返回id;
}
公共无效集合id(字符串id){
this.id=id;
}
公共字符串getName(){
返回名称;
}
公共void集合名(字符串名){
this.name=名称;
}
}
公共静态void main(字符串[]args)引发IOException{
字符串json=“{\'code\”:0\n+
“\”结果\“:{\n”+
“\“数据\”:[\n”+
“{\n”+
“\“id\:\“1000\”,\n”+
“\”名称\“:\”腾讯\“\n”+
},\n+
“{\n”+
“\“id\”:\“1001\”,\n”+
“\”名称\“:\”阿里巴巴\“\n”+
“}\n”+
“]\n”+
“}\n”+
"    }";
ObjectMapper mapper=新的ObjectMapper();
QuotationHttpResult result=mapper.readValue(json,新类型引用(){});
系统输出打印项次(结果);
}

此处的
数据
字段不会是
MyClass
类型。这将是
ArrayList
破坏所有类型安全。
class MyClass{
    String id;
    String name;
}
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);
}