1、需求描述
接口返回的是一个json数组,要获取到接口返回值并用实体类list接住。
2、解决方法
使用springboot框间自带的Http的工具类RestTemplate调接口,其返回值用hutool工具包中的Json转换工具类方法JSONUtil.parseArray转为Json数组既可(接口返回的数组只是形式上为json数组,但实际上还是字符串,可以理解为Json格式的字符串)
pom.xml引入Hutool的依赖
<!--引入Hutool-->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.4.5</version>
</dependency>
测试代码
@Test
public void testGetJiaYang() {
//SalaryHistoryInfoDTO salaryHistoryInfoDTO = new SalaryHistoryInfoDTO();
HttpHeaders requestHeaders = new HttpHeaders();
RestTemplate restTemplate = new RestTemplate();
String result;
String url = "http://localhost:10002/csm/customer/management/getPostData";
String token = "eyJhbG";
requestHeaders.add("Content-Type", "application/x-www-form-urlencoded;charset=utf-8");
//鉴权传token
requestHeaders.add("Authorization", token);
MultiValueMap<String, Object> map = new LinkedMultiValueMap<>();
map.add("funcId", "10");
map.add("paras", "2022-06-30");
//这里的map为请求接口时需要传的参数
HttpEntity<Map> requestEntity = new HttpEntity<>(map, requestHeaders);
//获取接口响应返回信息
ResponseEntity<Map> response = restTemplate.exchange(url, HttpMethod.POST, requestEntity, Map.class);
JSONArray jsonArray = JSONUtil.parseArray(response.getBody().get("data"));
List<PostEntity> postEntityList = jsonArray.toList(PostEntity.class);
for (PostEntity postEntity : postEntityList) {
System.out.println(postEntity.toString());
}
}
3、注意的点
使用JSONUtil.parseArray()方法把String转换成json数组时要注意
不要手残加一个toString()方法
虽然hutool.json包下的重载方法JSONUtil.parseArray()支持多种参数,既支持String,也支持Object。但不建议把参数转为String,因为会报一个错
报错原因是不符合数组的形式。
可以对比一下response.getBody().get(“data”)和response.getBody().get(“data”).toString()的值的区别。
很明显response.getBody().get(“data”)的值是一个数组,且size=10
而response.getBody().get(“data”).toString()就是一个字符串,根本就不是数组,所以就转为JSONArray就会报错!
4、总结
使用JSONUtil.parseArray时传入的参数不要加toString()。
5、疑问
JSONUtil.JSONArray parseArray(String jsonStr)支持传入参数为String的这个重载的方法有什么用?传了String进来,然后用JSONArray接就会报错??????????????????
源码中该方法的返回类型不就是JSONArray吗?希望有懂的大佬可以回答一下,不胜感激!!!
6、参考资料