我有两个问题:

如何使用Spring RestTemplate映射JSON对象列表。 如何映射嵌套的JSON对象。

我试图消费https://bitpay.com/api/rates,从http://spring.io/guides/gs/consuming-rest/遵循教程。


当前回答

我从这个帖子https://jira.spring.io/browse/SPR-8263找到了工作。

基于这篇文章,你可以返回一个类似这样的列表:

ResponseEntity<? extends ArrayList<User>> responseEntity = restTemplate.getForEntity(restEndPointUrl, (Class<? extends ArrayList<User>>)ArrayList.class, userId);

其他回答

你可以为每个条目创建POJO,

class BitPay{
private String code;
private String name;
private double rate;
}

然后使用BitPay列表的ParameterizedTypeReference,你可以使用:

RestTemplate restTemplate = new RestTemplate();
ResponseEntity<List<Employee>> response = restTemplate.exchange(
  "https://bitpay.com/api/rates",
  HttpMethod.GET,
  null,
  new ParameterizedTypeReference<List<BitPay>>(){});
List<Employee> employees = response.getBody();

我从这个帖子https://jira.spring.io/browse/SPR-8263找到了工作。

基于这篇文章,你可以返回一个类似这样的列表:

ResponseEntity<? extends ArrayList<User>> responseEntity = restTemplate.getForEntity(restEndPointUrl, (Class<? extends ArrayList<User>>)ArrayList.class, userId);

作为一个通用模块,Page<?>对象可以被模块反序列化,就像JodaModule, Log4jJsonModule等。参考我的回答。使用Pageable字段测试端点时出现JsonMappingException

也许这样……

ResponseEntity<Object[]> responseEntity = restTemplate.getForEntity(urlGETList, Object[].class);
Object[] objects = responseEntity.getBody();
MediaType contentType = responseEntity.getHeaders().getContentType();
HttpStatus statusCode = responseEntity.getStatusCode();

RequestMapping的控制器代码

@RequestMapping(value="/Object/getList/", method=RequestMethod.GET)
public @ResponseBody List<Object> findAllObjects() {

    List<Object> objects = new ArrayList<Object>();
    return objects;
}

ResponseEntity是HttpEntity的扩展,它添加了HttpStatus状态码。在RestTemplate和@Controller方法中使用。 在RestTemplate中,该类由getForEntity()和exchange()返回。

在我的情况下,我更喜欢提取一个字符串,然后使用JsonNode接口浏览上下文

    var response =  restTemplate.exchange("https://my-url", HttpMethod.GET, entity,  String.class);
    if (response.getStatusCode() == HttpStatus.OK) {
        var jsonString = response.getBody();
        ObjectMapper mapper = new ObjectMapper();
        JsonNode actualObj = mapper.readTree(jsonString);           
        
        System.out.println(actualObj);  
    }

或者很快

ObjectNode actualObj= restTemplate.getForObject("https://my-url", ObjectNode.class);

然后读取内部数据与路径表达式,即。

boolean b = actualObj.at("/0/states/0/no_data").asBoolean();