最近在解析接口返回的json格式时候,遇到了一些较复杂的格式,就是符合条件的数据格式不固定,可能是Map,也可能是List,写代码的时候写了很多instanceof判断导致代码很复杂
json如下图,
其实只需要找出符合resources_code=04里面的remain_res,但是resources_info和sec_resources_info不固定(List,Map),这种情况下可以使用json path解析比较方便.
代码如下:
import com.jayway.jsonpath.Filter;
import com.jayway.jsonpath.JsonPath;
public void test3() {
String jsonStr = "{ \"status\": 0, \"message\": \"成功\", \"data\": { \"opr_time\": \"20150612125212\", \"plan_remain\": [ { \"plan_name\": \"测试套餐\", \"plan_i_d\": \"000001\", \"resources_info\": [ { \"resources_code\": \"04\", \"sec_resources_info\": [ { \"sec_resources_name\": \"省内流量\", \"resources_left_info\": { \"total_res\": \"100\", \"used_res\": \"50\", \"remain_res\": \"50\", \"unit\": \"02\", \"valid_date\": \"20150611235959\" } }, { \"sec_resources_name\": \"数据流量\", \"resources_left_info\": { \"total_res\": \"100\", \"used_res\": \"40\", \"remain_res\": \"60\", \"unit\": \"02\", \"valid_date\": \"20150611235959\" } } ] }, { \"resources_code\": \"04\", \"sec_resources_info\": { \"sec_resources_name\": \"省内流量\", \"resources_left_info\": { \"total_res\": \"102400\", \"used_res\": \"88336\", \"remain_res\": \"14064\", \"unit\": \"03\", \"valid_date\": \"20150611235959\" } } } ] }, { \"plan_name\": \"测试套餐2\", \"plan_i_d\": \"0002\", \"resources_info\": { \"resources_code\": \"04\", \"sec_resources_info\": { \"sec_resources_name\": \"省内流量\", \"resources_left_info\": { \"total_res\": \"200\", \"used_res\": \"47\", \"remain_res\": \"153\", \"unit\": \"01\", \"valid_date\": \"20150611235959\" } } } }, { \"plan_name\": \"测试套餐3\", \"plan_i_d\": \"0003\", \"resources_info\": { \"resources_code\": \"04\", \"sec_resources_info\": { \"sec_resources_name\": \"省内流量\", \"resources_left_info\": { \"total_res\": \"2400\", \"used_res\": \"626\", \"remain_res\": \"1774\", \"unit\": \"01\", \"valid_date\": \"20150611235959\" } } } }, { \"plan_name\": \"测试套餐4\", \"plan_i_d\": \"00044\", \"resources_info\": [ { \"resources_code\": \"04\", \"is_multi_term\": \"0\", \"sec_resources_info\": { \"sec_resources_name\": \"数据流量\", \"resources_left_info\": { \"total_res\": \"30720\", \"used_res\": \"30720\", \"remain_res\": \"0\", \"unit\": \"03\", \"valid_date\": \"20150612143627\" } } }, { \"resources_code\": \"01\", \"is_multi_term\": \"1\", \"sec_resources_info\": { \"sec_resources_name\": \"语音\", \"resources_left_info\": { \"total_res\": \"150\", \"used_res\": \"37\", \"remain_res\": \"113\", \"unit\": \"01\", \"valid_date\": \"20150612143627\" } } } ] } ] } } ";
JsonPath path = JsonPath
.compile("$.data.plan_remain..resources_info[?(@.resources_code == '04')].sec_resources_info..resources_left_info.remain_res");
List<Object> resourceList = path.read(jsonStr);
for (Object obj : resourceList) {
if (obj instanceof String) {
System.out.println(obj.toString());
}
}
}
结果为:
50
60
14064
153
1774
0