Java中如何从Rest请求返回的JSON对象中提取特定字段的值
解决方案
问题说明
你当前代码的解析逻辑默认接口返回根节点下存在data字段对应JSON数组,但你贴出的接口响应示例根节点直接包含datas字段,我们分两种常见场景给出实现方案:
场景1:接口返回结构与你贴出的示例完全一致(无外层data数组)
返回结构示例:
{"value":"DRAGON","datas":9.5}
调整后的代码如下:
public String getData(String value) throws ParseException { final String url = "https://v1/supplier/suggest/{value}"; Map<String, String> params = new HashMap<String, String>(); params.put("value", value); HttpEntity<?> httpEntity = new HttpEntity<>(this.getAuthHeaders()); RestTemplate restTemplate = new RestTemplate(); ResponseEntity<String> tpBody = restTemplate.exchange(url, HttpMethod.GET, httpEntity, String.class, params); JSONParser parser = new JSONParser(); JSONObject json = (JSONObject) parser.parse(tpBody.getBody()); // 直接从根节点提取datas字段,转为Double类型 Double datas = (Double) json.get("datas"); System.out.println(datas); // 按需返回对应值即可 return datas.toString(); }
场景2:你贴出的响应示例为data数组内单个元素的结构(接口返回带外层data数组)
实际返回结构示例:
{ "data": [ {"value":"DRAGON","datas":9.5} ] }
调整后的代码如下:
public String getData(String value) throws ParseException { final String url = "https://v1/supplier/suggest/{value}"; Map<String, String> params = new HashMap<String, String>(); params.put("value", value); HttpEntity<?> httpEntity = new HttpEntity<>(this.getAuthHeaders()); RestTemplate restTemplate = new RestTemplate(); ResponseEntity<String> tpBody = restTemplate.exchange(url, HttpMethod.GET, httpEntity, String.class, params); JSONParser parser = new JSONParser(); JSONObject json = (JSONObject) parser.parse(tpBody.getBody()); JSONArray jsonArray = (JSONArray) json.get("data"); if (jsonArray.isEmpty()) { System.out.println("No Data in JsonArray"); return null; } // 把数组第一个元素转为JSONObject,再提取datas字段 JSONObject firstItem = (JSONObject) jsonArray.get(0); Double datas = (Double) firstItem.get("datas"); System.out.println(datas); return datas.toString(); }
内容的提问来源于stack exchange,提问作者JavaGuy
相关产品推荐
相关产品推荐

