Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.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 自定义JSON到POJO映射器 上下文_Java_Json_Resttemplate_Pojo - Fatal编程技术网

Java 自定义JSON到POJO映射器 上下文

Java 自定义JSON到POJO映射器 上下文,java,json,resttemplate,pojo,Java,Json,Resttemplate,Pojo,我尝试使用RestTemplate GET请求接收数据,服务器以JSON格式返回我需要的数据,响应包含我需要的所有数据,但它也包含大量多余的数据,我不想将包含多余数据的多余字段添加到POJO以自动映射它 问题是 我是否可以制作一个自定义映射器,只将某些JSON字段映射到我的java类?非常感谢您的帮助 一些代码示例 之前,我将JSON直接映射到我的POJO,如下所示: ResponseEntity<Foo> response = new RestTemplate(requestFac

我尝试使用RestTemplate GET请求接收数据,服务器以JSON格式返回我需要的数据,响应包含我需要的所有数据,但它也包含大量多余的数据,我不想将包含多余数据的多余字段添加到POJO以自动映射它

问题是 我是否可以制作一个自定义映射器,只将某些JSON字段映射到我的java类?非常感谢您的帮助

一些代码示例 之前,我将JSON直接映射到我的POJO,如下所示:

ResponseEntity<Foo> response = new RestTemplate(requestFactory)
            .exchange(uri, HttpMethod.GET, entity, new ParameterizedTypeReference<Foo>(){});
[{
    "idReadable": "idR",
    "customFields": [{
        "projectCustomField": {
            "field": {
                "name": "Name",
                "$type": "type"
            },
            "$type": "type"
        },
        "value": {
            "name": "Value",
            "$type": "type"
        },
        "$type": "type"
    }],
    "id": "id",
    "$type": "type"
}]
    ArrayNode nodeList = jp.getCodec().readTree(jp);
    HashMap<String, String> fields = new HashMap<>();
    List<Issue> foos = new ArrayList<>();

    for (JsonNode node : nodeList) {
        String id = node.get("id").asText();
        issues.add(new Foo(id));
    }
我只需要两个“name”值

解决方案 正如@mostneededrabbit在评论中建议的那样,解决方案是为RestTemplate编写自定义反序列化程序扩展StdDeserializer,其中的RestTemplate如下所示:

ResponseEntity<Foo> response = new RestTemplate(requestFactory)
            .exchange(uri, HttpMethod.GET, entity, new ParameterizedTypeReference<Foo>(){});
[{
    "idReadable": "idR",
    "customFields": [{
        "projectCustomField": {
            "field": {
                "name": "Name",
                "$type": "type"
            },
            "$type": "type"
        },
        "value": {
            "name": "Value",
            "$type": "type"
        },
        "$type": "type"
    }],
    "id": "id",
    "$type": "type"
}]
    ArrayNode nodeList = jp.getCodec().readTree(jp);
    HashMap<String, String> fields = new HashMap<>();
    List<Issue> foos = new ArrayList<>();

    for (JsonNode node : nodeList) {
        String id = node.get("id").asText();
        issues.add(new Foo(id));
    }

您可以通过将以下内容放在类的顶部来忽略不需要的字段:

@JsonIgnoreProperties(ignoreUnknown = true)

然后只保留类中所需的字段。

由于复杂的响应嵌套系统,我不确定是否可以通过注释实现这一点,但不管怎样,我很好奇是否有办法实现某种类型的映射器?添加了我试图转换的json,也许这有助于理解任务better@mmmetafool遍历JSON是您正在寻找的解决方案类型吗?或者一些更“开箱即用”的东西?我想如果我不需要多次处理响应,那么遍历就可以了,如果我可以在RestTemplate获取数据的同时处理它,那就太好了。我可以配置我自己的反序列化程序吗?@mmmetafool也许这会有帮助-