RestTemplate сопоставляет объект пары "ключ-значение" JSON с динамическими ключами

Я получаю ответ объекта пары ключ-значение JSON с динамическими ключами для HTTP-запроса, выполненного с использованием Java Spring RestTemplate, как показано ниже.

Ответ:

{
    "1234x": {
        "id": "1234x",
        "description": "bla bla",
        ... 
    },
    "5678a": {
        "id": "5678a",
        "description": "bla bla bla",
        ... 
    },
    ...
}

Как сопоставить объект ответа с POJO или Map?

Я использую RestTemplate следующим образом.

RestTemplate restTemplate = new RestTemplate();
String url = "my url";
HttpHeaders headers = new HttpHeaders();
HttpEntity entity = new HttpEntity(headers);
response = restTemplate.exchange(url, HttpMethod.GET, entity, ???);

person Shanika Ediriweera    schedule 27.11.2018    source источник
comment
Получите ответ в виде строки и проанализируйте его с помощью JSON.   -  person Himesh goswami    schedule 27.11.2018
comment
Второй подход: эта ссылка ниже stackoverflow.com/questions/35465273/   -  person Himesh goswami    schedule 27.11.2018
comment
Имеет ли json одинаковую структуру для всех объектов? Насколько это динамично, имена параметров или длина меняются?   -  person Emre Savcı    schedule 27.11.2018
comment
@Emre Savcı, как вы видите, ключи - это идентификаторы. Таким образом, он каждый раз разный, и количество пар ключ-значение также различается.   -  person Shanika Ediriweera    schedule 27.11.2018


Ответы (2)


Вы можете просто использовать ParameterizedTypeReference с Map (вы можете настроить его в соответствии со своим вариантом использования):

response = restTemplate.exchange(url, HttpMethod.GET, entity, new ParameterizedTypeReference<Map<String, Object>>() {});
person Emre Savcı    schedule 27.11.2018
comment
Когда я использовал это, в модульном тесте возникла ошибка. Mockito.when(restTemplate.exchange(......)).thenReturn(new ResponseEntity<HashMap<String, ItemDetails>>(map, HttpStatus.ACCEPTED));. Он говорит cannot resolve method thenReturn(...) с типом параметра. - person Shanika Ediriweera; 27.11.2018
comment
Можете ли вы поделиться полным исключением? Похоже, это связано с вашим типом возвращаемого значения, переданным методу thenReturn. - person Emre Savcı; 27.11.2018
comment
Это синтаксическая ошибка Cannot resolve method 'thenReturn(org.springframework.http.ResponseEntity<java.util.HashMap<java.lang.String,com.myproject.MyClass>>)' - person Shanika Ediriweera; 27.11.2018
comment
Вы должны указать какое-то значение внутри метода thenReturn(), например thenReturn(ResponseEntity.ok(new HashMap())); . - person Emre Savcı; 27.11.2018
comment
Я дал значение. thenReturn(new ResponseEntity<HashMap<String, ItemDetails>>(map, HttpStatus.ACCEPTED)); - person Shanika Ediriweera; 27.11.2018
comment
Спасибо. Исправил. Проблема была с матчером Mockito. Исправлено обращение к stackoverflow.com/questions/29670463/. - person Shanika Ediriweera; 27.11.2018
comment
Я рад, что это помогает - person Emre Savcı; 27.11.2018

Вы можете использовать new ObjectMapper.readValue() и указать TypeReference как new TypeReference<Map<String, SimplePOJO>>() {});

public static void main(String[] args) throws IOException {
    final String json = "{\"1234x\": {\"id\": \"1234x\", \"description\": \"bla bla\"}, \"5678a\": {\"id\": \"5678a\", \"description\": \"bla bla bla\"}}";
    Map<String, SimplePOJO> deserialize =
            new ObjectMapper().readValue(json, new TypeReference<Map<String, SimplePOJO>>() {});
}

public static class SimplePOJO {
    private String id;
    private String description;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        SimplePOJO that = (SimplePOJO) o;
        return Objects.equals(id, that.id) &&
                Objects.equals(description, that.description);
    }

    @Override
    public int hashCode() {
        return Objects.hash(id, description);
    }
}
person Mr. Skip    schedule 27.11.2018
comment
Как совместить это с методом restTemplate.exchange()? - person Shanika Ediriweera; 27.11.2018
comment
@ShanikaEdiriweera response = restTemplate.exchange(url, HttpMethod.GET, entity, String.class); Map<String, SimplePOJO> deserialize = new ObjectMapper().readValue(response.getBody(), new TypeReference<Map<String, SimplePOJO>>() {}); - person Mr. Skip; 27.11.2018