来自Spring RestClient和Jackson的嵌套JSON对象

jebrick:

我有一个REST Client,它将从端点取回JSON。我只想获取data []中的内容。

{
    "responseStatus": "SUCCESS",
    "responseDetails": {
        "limit": 1000,
        "offset": 0,
        "size": 2,
        "total": 2
    },
    "data": [
        {
            "id": "00P000000001M01",
            "name__v": "Foo",
            "status__v": [
                "active__v"
            ],
            "abbreviation__c": "F170053",
            "internal_name__c": "Foo",
            "therapeutic_area__c": [
                "neurology__c"
            ],
            "external_id__v": "84",
            "generic_name__c": "Foo",
            "scientific_name__c": null
        },
        {
            "id": "00P000000001N01",
            "name__v": "Bar",
            "status__v": [
                "active__v"
            ],
            "abbreviation__c": "B333334",
            "internal_name__c": "Bar",
            "therapeutic_area__c": [
                "bone_muscle_joint__c"
            ],
            "external_id__v": "101",
            "generic_name__c": "Bar",
            "scientific_name__c": null
        }
    ]
}

因为我将进行其他调用,这些调用将返回data []中的不同字段,所以我想将每种类型映射到POJO,所以我使用了@JSONProperty

@JsonIgnoreProperties(ignoreUnknown = true)
public class Product extends VBase{
    private String fNumber;
    private String genericName;
    private String scientificName;
    private String therapeuticArea;


    public String getFNumber() {
        return fNumber;
    }

    @JsonProperty("abbreviation__c")
    private void unpackFNumber(Map<String,Object> abbreviation__c){
        fNumber = ((Map<String,Object>)abbreviation__c.get("data")).get("abbreviation__c").toString();
    }
    public void setLyNumber(String fNumber) {
        this.fNumber = fNumber;
    }

    public String getGenericName() {
        return genericName;
    }


    @JsonProperty("generic_name__c")
    private void unpackGenericName(Map<String,Object> generic_name__c){
        genericName = ((Map<String,Object>)generic_name__c.get("data")).get("generic_name__c").toString();
    }
    public String getScientificName() {
        return scientificName;
    }

    @JsonProperty("scientific_name__c")
    private void unpackScientificName(Map<String,Object>sName){
        scientificName = ((Map<String,Object>)sName.get("data")).get("scientific_name__c").toString();
    }

    public String getTherapeuticArea() {
        return therapeuticArea;
    }

    @JsonProperty("therapeutic_area__c")
    private void unpackTheraputicArea(Map<String,Object>tArea){
        therapeuticArea=((Map<String,Object>)tArea.get("data")).get("therapeutic_area__c").toString();
    }
}

我尝试了各种方法来获取数据[]。

 HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<>(map, headers);
        RestTemplate restTemplate = new RestTemplate(clientHttpReq);
        ResponseEntity<Product[]> response = restTemplate.exchange(url, HttpMethod.GET, request,Product[].class);

//ResponseEntity<Product[]> response = restTemplate.postForEntity(url,request,Product[].class ,parmMap);

我一直试图避免的是使用Data []作为字段来创建ResponseDetail POJO。我知道它会工作,但是因为data []中的字段将根据端点而变化。

我可以使用带有列表的包装器类来表示data [],因为所有POJO都将扩展VBase吗?

这是例外:

Exception in thread "main" org.springframework.web.client.RestClientException: Error while extracting response for type [class [Lcom.lilly.models.Product;] and content type [application/json;charset=UTF-8]; nested exception is org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot deserialize instance of `com.lilly.models.Product[]` out of START_OBJECT token; nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `com.lilly.models.Product[]` out of START_OBJECT token
 at [Source: (PushbackInputStream); line: 1, column: 1]
Holinc:

如下所示声明一个POJO类,然后可以从POJO获取数据属性。

@Data
public class Example {
    private String responseStatus;
    private ResponseDetails responseDetails;
    private List<Data> data;

    @lombok.Data
    public static class ResponseDetails {
        private int limit;
        private int offset;
        private int size;
        private int total;
    }

    @lombok.Data
    public static class Data {
        private String id;
        private String name__v;
        private String abbreviation__c;
        private String internal_name__c;
        private String external_id__v;
        private String generic_name__c;
        private Object scientific_name__c;
        private List<String> status__v;
        private List<String> therapeutic_area__c;
    }

    @lombok.Data
    @JsonIgnoreProperties(ignoreUnknown = true)
    public static class Product {
        @JsonProperty("name__v")
        private String fNumber;
        @JsonProperty("generic_name__c")
        private String genericName;
        @JsonProperty("scientific_name__c")
        private String scientificName;
        @JsonProperty("therapeutic_area__c")
        private List<String> therapeuticArea;
    }

    public static void main(String[] args) {
        String jsonResult = "{\"responseStatus\":\"SUCCESS\",\"responseDetails\":{\"limit\":1000,\"offset\":0,\"size\":2,\"total\":2},\"data\":[{\"id\":\"00P000000001M01\",\"name__v\":\"Foo\",\"status__v\":[\"active__v\"],\"abbreviation__c\":\"F170053\",\"internal_name__c\":\"Foo\",\"therapeutic_area__c\":[\"neurology__c\"],\"external_id__v\":\"84\",\"generic_name__c\":\"Foo\",\"scientific_name__c\":null},{\"id\":\"00P000000001N01\",\"name__v\":\"Bar\",\"status__v\":[\"active__v\"],\"abbreviation__c\":\"B333334\",\"internal_name__c\":\"Bar\",\"therapeutic_area__c\":[\"bone_muscle_joint__c\"],\"external_id__v\":\"101\",\"generic_name__c\":\"Bar\",\"scientific_name__c\":null}]}";
        ObjectMapper objectMapper = new ObjectMapper();
        try {
            Example example = objectMapper.readValue(jsonResult, new TypeReference<Example>() {
            });
            //you can get data[] via example.getData()
            System.out.println(objectMapper.writeValueAsString(example.getData()));

            List<Product> products = objectMapper.readValue(objectMapper.writeValueAsString(example.getData()), new TypeReference<List<Product>>() {
            });
            //you can also parse data[] as List<Product>
            System.out.println(JSONObject.toJSONString(products));

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Spring和Jackson:动态设置JSON忽略

使用Ajax XMLHttpRequest()和来自Spring后端的JSON数据填充表

使用Spring RestTemplate的可选嵌套JSON对象

Spring WebClient过滤来自Json Request的Null

来自Angular 5中json对象的动态嵌套Material菜单

Spring Boot-在JSP中显示来自控制器的对象数据

Swagger UI导致来自带有文件和json-object的spring-resources的Multipart-FormData请求失败

修改来自Spring Boot Rest Controller的默认JSON错误响应

来自数据表和IList的嵌套JSON

Spring Boot JSON返回无限的嵌套对象

C#过滤来自restclient的json结果

来自JSON的Spring MVC RequestMapping

来自JSON对象的Highchart

使用spring-security和来自websocket消息的访问主体来保护Spring-Webscoket

Spring / Jackson映射内部JSON对象

Spring Jackson无法解析JSON对象

Spring Boot JPA - 带有嵌套对象和 id 的 json

Spring-AMQP 可以连接和处理来自 AMQP1.0 代理的消息吗

来自javascript嵌套数组的json对象

Spring Restful Web API中的@RequestBody不接受来自请求为JSON的客户端的请求

在返回给客户端之前,在 Spring 中拦截来自 RestController 或 Hibernate 的对象实例

为我正在使用的每个项目创建 Spring @Repository 和 @Controller(来自数据库)

来自 spring-boot 应用程序的 JSON 格式而不是 xml 的响应?

如何在没有来自其他类的嵌套对象的情况下返回 JSON 对象?

使用来自 POST 方法的 JDBCTemplate 存储对象数组 - Spring Boot

在 Chrome 和 Postman 中调试来自 Spring 的服务器发送的事件流

来自 ruby 哈希的嵌套 json

来自 Json 值的嵌套值

使用 Spring Boot 中的自定义“根键”映射来自 application.yml 的对象列表