获取jsonPath,对比两个json是否相等

    xiaoxiao2022-07-03  167

    文章目录

    mavne的pom文件实现代码执行结果

    mavne的pom文件

    <dependencies> <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.31</version> </dependency> <dependency> <groupId>org.testng</groupId> <artifactId>testng</artifactId> <version>6.11</version> </dependency> </dependencies>

    实现代码

    /** * @param jsonObject * @return */ public static List<String> getListJson(JSONObject jsonObject) { // 获取到所有jsonpath后,获取所有的key List<String> jsonPaths = JSONPath.paths(jsonObject).keySet() .stream() .collect(Collectors.toList()); //去掉根节点key List<String> parentNode = new ArrayList<>(); //根节点key parentNode.add("/"); //循环获取父节点key,只保留叶子节点 for (int i = 0; i < jsonPaths.size(); i++) { if (jsonPaths.get(i).lastIndexOf("/") > 0) { parentNode.add(jsonPaths.get(i).substring(0, jsonPaths.get(i).lastIndexOf("/"))); } } //remove父节点key for (String parentNodeJsonPath : parentNode) { jsonPaths.remove(parentNodeJsonPath); } List<String> jsonPathList = new ArrayList<>(); Iterator<String> jsonPath = jsonPaths.iterator(); //将/替换为点. while (jsonPath.hasNext()) { jsonPathList.add(jsonPath.next().replaceFirst("/", "").replaceAll("/", ".")); } //排序 Collections.sort(jsonPathList); return jsonPathList; } /** * 获取两个Json相同的JsonPath * @param oneJson * @param twoJson * @return */ public static Set getTwoJsonSameJsonPath(JSONObject oneJson,JSONObject twoJson){ List<String> oneListJsonPath = getListJson(oneJson); List<String> twoListJsonPath = getListJson(twoJson); //获取两个json有相同路径的jsonPath Set sameJsonPath = new HashSet(); for (String oneJsonPath:oneListJsonPath){ for (String twoJsonPath:twoListJsonPath){ if (oneJsonPath.equals(twoJsonPath)){ sameJsonPath.add(oneJsonPath); break; } } } return sameJsonPath; } /** * 获取两个json所有的jsonPath * @param oneJson * @param twoJson * @return */ public static Set getTwoJsonAllJsonPath(JSONObject oneJson,JSONObject twoJson){ List<String> oneListJsonPath = getListJson(oneJson); List<String> twoListJsonPath = getListJson(twoJson); //获取两个json有相同路径的jsonPath Set allJsonPath = new HashSet(); allJsonPath.addAll(oneListJsonPath); allJsonPath.addAll(twoListJsonPath); return allJsonPath; } /** * 通过jsonPath去获取两个json的value,并校验类型和值是否相等 * @param jsonPathList * @param oneJson * @param twoJson */ public static void checkTwoJsonSame(Set jsonPathList,JSONObject oneJson,JSONObject twoJson){ for (Object jsonPath:jsonPathList){ Object oneJsonValue = JSONPath.eval(oneJson,jsonPath.toString()); Object twoJsonValue = JSONPath.eval(twoJson,jsonPath.toString()); if (!JSONPath.contains(oneJson,jsonPath.toString())){ System.out.println(String.format("oneJsonPath字段不存在,jsonPath = %s ,value2 = %s",jsonPath,twoJsonValue)); break; }else if (!JSONPath.contains(twoJson,jsonPath.toString())){ System.out.println(String.format("twoJsonPath字段不存在,jsonPath = %s ,value1 = %s",jsonPath,oneJsonValue)); break; } if (oneJsonValue.equals(twoJsonValue)){ System.out.println(String.format("相同,jsonPath = %s,value = %s",jsonPath,oneJsonValue)); } else if (String.valueOf(oneJsonValue).equals(String.valueOf(twoJsonValue))){ System.out.println(String.format("字段类型不相同,jsonPath = %s,value1 = %s,value2 = %s",jsonPath,oneJsonValue,twoJsonValue)); } else { System.out.println(String.format("字段值不相同,jsonPath = %s,value1 = %s,value2 = %s",jsonPath,oneJsonValue,twoJsonValue)); } } } @Test(description = "判断两个json是否相等") public void checkTwoJson(){ JSONObject oneJsonObject = new JSONObject(); JSONPath.set(oneJsonObject,"data.person","个人"); JSONPath.set(oneJsonObject,"data.student.age","20"); JSONPath.set(oneJsonObject,"data.student.name","张三"); JSONObject twoJsonObject = new JSONObject(); JSONPath.set(twoJsonObject,"data.person","个人"); JSONPath.set(twoJsonObject,"data.student.age",20); Set allJsonPath = getTwoJsonAllJsonPath(oneJsonObject,twoJsonObject); checkTwoJsonSame(allJsonPath,oneJsonObject,twoJsonObject); } @Test(description = "判断两个json共同存在字段的字段值是否相等") public void checkTwoJsonSame(){ JSONObject oneJsonObject = new JSONObject(); JSONPath.set(oneJsonObject,"data.person","个人"); JSONPath.set(oneJsonObject,"data.student.age","20"); JSONPath.set(oneJsonObject,"data.student.name","张三"); JSONObject twoJsonObject = new JSONObject(); JSONPath.set(twoJsonObject,"data.person","个人"); JSONPath.set(twoJsonObject,"data.student.age",20); Set sameJsonPath = getTwoJsonSameJsonPath(oneJsonObject,twoJsonObject); checkTwoJsonSame(sameJsonPath,oneJsonObject,twoJsonObject); }

    执行结果

    用例1: 相同,jsonPath = data.person,value = 个人 字段类型不相同,jsonPath = data.student.age,value1 = 20,value2 = 20 twoJsonPath字段不存在,jsonPath = data.student.name ,value1 = 张三 用例2: 相同,jsonPath = data.person,value = 个人 字段类型不相同,jsonPath = data.student.age,value1 = 20,value2 = 20

    最新回复(0)