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" } } }