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