2020年05月31号更新,解析JSON格式数据的两种方式,第一种方式引入开源的jar包,第二种方式自己封装公共读取方法,在这里先简单的记录一下,方便后续查看。
方式一 利用JsonPath解析
1、 JsonPath的使用方法
- 首先需要引入jar包
<dependency> <groupId>com.jayway.jsonpath</groupId> <artifactId>json-path</artifactId> <version>2.4.0</version> </dependency>
- 常用解析方式总结
1、静态读取API(需要多次读取时不推荐使用,因为每次读取都要解析一遍文档)Response response ; String json = resposne.asString(); String result = JsonPath.read(json,"$.data.departCode") 2、先解析整个文档,再读取 Object document = Configuration.defaultConfiguration().jsonProvider().parse(json); String result1 = JsonPath.read(document,"$.data.departments[0].departCode"); List<String> result2 = JsonPath.read(document,"$.data.departments[?(@.id>0)].departCode"); 3、比较灵活的一个方法 ReadContext ctx = JsonPath.parse(testJson); String result1 = ctx.read("$.data.departments[0].departCode"); List<String> result2 = ctx.read("$.data.departments[?(@.id==0)].departCode"); 4、filter方式获取数据 Filter cheapFictionFilter1 = filter(where("departCode").is("知名专家团队").and("id").eq(1)); Filter cheapFictionFilter = filter(where("departCode").exists(true)); List<String> result3 = parse(testJson).read("$.data.departments[?]", cheapFictionFilter); 注:占位符?代表过滤器,当有多个过滤器时用类似这种方式去表示[?,?]
这儿就附上官方参考地址:JsonPath
方式二 自己封装解析方法
-
下面的代码如果编写有误或者可以优化的地方还请大家指正
import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; public class JsonUtil { /** * 获取json串某一字段的值 * * @param response 接口返回的json值转换后 * @param keys 调用示例 String str = JsonUtils.getJsonValueRec(string,"data.departments.subDepartments.name",0); * @param index 需要取列表中第几个的值,一般传0就可以 * @return 返回String类型的结果值 */ public static String getJsonValueRec(String response, String keys, int index) { String[] key = keys.split("\\."); if (key.length == 1) { if (response.startsWith("[")) { return parseJsonArray(response, index, key[0]); } if (response.startsWith("{")) { return parseJsonObject(response, key[0]); } } else if (key.length > 1) { if (response.startsWith("[")) { response = parseJsonArray(response, index, key[0]); keys = keys.substring(key[0].length() + 1); return getJsonValueRec(response, keys, index); } if (response.startsWith("{")) { response = parseJsonObject(response, key[0]); keys = keys.substring(key[0].length() + 1); return getJsonValueRec(response, keys, index); } } return "No corresponding value found"; } private static String parseJsonArray(String response, int index, String key) { JSONArray resultArray = JSONObject.parseArray(response); return resultArray.getJSONObject(index).getString(key); } private static String parseJsonObject(String response, String key) { JSONObject jsonObject = JSONObject.parseObject(response); return jsonObject.get(key).toString(); } }
-
最后附上自己测试的JSON数据格式,作为一个测试猿编写完肯定要充分测试的,就先记录这么多,后续有更好的解析方法会更新
{ "resCode":0, "msg":"SUCCESS", "firstJson":{ "secondJson":"sencondJson value", "secondJson1":[ { "thirdJson":1234, "thirdJson1":[ { "fourthJson":[ { "fifthJson":true } ] } ], "thirdJson2":{ "fourthJsonList":"fourthJson list value", "fourthJsonList1":"fourthJson list value1" } } ], "secondJson2":{ "thirdJsonList":"thirdJson list value", "thirdJsonList1":"thirdJson list value1" } } }