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