【问题标题】:RestTemplate map JSON key-value pair object with with dynamic keysRestTemplate 使用动态键映射 JSON 键值对对象
【发布时间】:2018-11-27 06:46:49
【问题描述】:

我得到一个 JSON 键值对对象的响应,其中包含使用 Java Spring RestTemplate 完成的 HTTP 请求的动态键,如下所示。

回应:

{
    "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, ???);

【问题讨论】:

  • 以字符串形式获取响应并使用 JSON 解析。
  • 第二个方法是这样的:stackoverflow.com/questions/35465273/…下面的这个链接
  • json 对所有对象都具有相同的结构吗?它有多动态,参数名称或长度变化?
  • @Emre Savcı 如您所见,键是 id。所以每次都不同,键值对的数量也不同。

标签: java spring-boot resttemplate objectmapper


【解决方案1】:

您可以简单地将 ParameterizedTypeReferenceMap 一起使用(您可以根据自己的用例进行自定义):

response = restTemplate.exchange(url, HttpMethod.GET, entity, new ParameterizedTypeReference<Map<String, Object>>() {});

【讨论】:

  • 当我使用它时,单元测试中出现错误。 Mockito.when(restTemplate.exchange(......)).thenReturn(new ResponseEntity&lt;HashMap&lt;String, ItemDetails&gt;&gt;(map, HttpStatus.ACCEPTED));。它用参数类型表示cannot resolve method thenReturn(...)
  • 你能分享完整的例外吗?它似乎与您传递给 thenReturn 方法的返回类型有关。
  • 语法错误Cannot resolve method 'thenReturn(org.springframework.http.ResponseEntity&lt;java.util.HashMap&lt;java.lang.String,com.myproject.MyClass&gt;&gt;)'
  • 你应该在 thenReturn() 方法中给出一些值,比如thenReturn(ResponseEntity.ok(new HashMap()));
  • 我给出了一个值。 thenReturn(new ResponseEntity&lt;HashMap&lt;String, ItemDetails&gt;&gt;(map, HttpStatus.ACCEPTED));
【解决方案2】:

您可以使用new ObjectMapper.readValue() 并将TypeReference 指定为new TypeReference&lt;Map&lt;String, SimplePOJO&gt;&gt;() {});

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);
    }
}

【讨论】:

  • 如何与restTemplate.exchange()方法结合?
  • @ShanikaEdiriweera response = restTemplate.exchange(url, HttpMethod.GET, entity, String.class); Map&lt;String, SimplePOJO&gt; deserialize = new ObjectMapper().readValue(response.getBody(), new TypeReference&lt;Map&lt;String, SimplePOJO&gt;&gt;() {});
猜你喜欢
  • 2018-05-16
  • 1970-01-01
  • 2019-06-26
  • 2019-04-28
  • 2019-12-27
  • 1970-01-01
  • 2022-01-10
  • 2016-02-18
  • 1970-01-01
相关资源
最近更新 更多