如何解析URL返回的JSON对象数组?RestTemplate响应解析问题咨询
RestTemplate解析JSON数组响应解决方案
问题原因
你当前直接使用Object[].class作为响应类型,RestTemplate会把JSON数组中的每个对象默认解析为LinkedHashMap实例,无法直接通过字段名访问属性,且不具备类型安全性。同时你原有代码存在语法错误:exchange()方法返回的是ResponseEntity对象,不能直接赋值给数组类型。
方案1:自定义实体类映射(推荐)
步骤1:定义匹配JSON结构的实体类
首先根据返回的JSON结构定义两个实体类,嵌套的models数组单独定义子实体:
import com.fasterxml.jackson.annotation.JsonProperty; import java.util.List; // 嵌套的models对象实体 public class Model { private String description; private String id; // JSON中字段首字母大写,加注解映射 @JsonProperty("Planning") private Boolean planning; // 补全无参构造、getter和setter方法 } // 外层响应对象实体 public class RespItem { private String name; private String description; private String createdBy; private String id; private List<Model> models; private String changedBy; private String openURL; // 兼容不同返回项的独有字段,不存在时会自动赋值为null private String changed; private String URL; // 补全无参构造、getter和setter方法 }
步骤2:使用ParameterizedTypeReference接收泛型集合
要正确解析泛型类型的响应,需要使用ParameterizedTypeReference指定泛型类型:
import org.springframework.core.ParameterizedTypeReference; import org.springframework.http.ResponseEntity; import java.util.List; ParameterizedTypeReference<List<RespItem>> typeRef = new ParameterizedTypeReference<List<RespItem>>() {}; ResponseEntity<List<RespItem>> resp = restTemplate.exchange(url, HttpMethod.GET, item, typeRef); // 获取解析后的对象列表 List<RespItem> itemList = resp.getBody();
方案2:无需自定义实体类,使用JsonNode动态取值
如果不想定义实体类,可以直接用JsonNode接收响应,动态读取属性:
import com.fasterxml.jackson.databind.JsonNode; import org.springframework.core.ParameterizedTypeReference; import org.springframework.http.ResponseEntity; import java.util.List; ParameterizedTypeReference<List<JsonNode>> typeRef = new ParameterizedTypeReference<List<JsonNode>>() {}; ResponseEntity<List<JsonNode>> resp = restTemplate.exchange(url, HttpMethod.GET, item, typeRef); List<JsonNode> nodeList = resp.getBody(); // 取值示例 for (JsonNode node : nodeList) { String name = node.get("name").asText(); String id = node.get("id").asText(); // 读取嵌套的models数组 JsonNode models = node.get("models"); if (models != null && models.isArray()) { for (JsonNode modelNode : models) { String modelId = modelNode.get("id").asText(); Boolean planning = modelNode.get("Planning").asBoolean(); } } }
内容的提问来源于stack exchange,提问作者Ritesh Singh
相关产品推荐
相关产品推荐

