搭建网站公司哪家好制作短链接网站
2026/4/6 2:16:03 网站建设 项目流程
搭建网站公司哪家好,制作短链接网站,wordpress 字体定义,谷歌搜索引擎入口google在工作中遇到需要对前后两组数据进行比对#xff0c;并返回比对结果#xff0c;最终决定使用json进行比对#xff0c;下面是几种方案。核心工具对比1. JSONassert#xff08;测试场景首选#xff09; JSONassert 是专为测试设计的 JSON 比对工具#xff0c;支持 忽略字段…在工作中遇到需要对前后两组数据进行比对并返回比对结果最终决定使用json进行比对下面是几种方案。核心工具对比1. JSONassert测试场景首选JSONassert 是专为测试设计的 JSON 比对工具支持 忽略字段顺序、数组顺序、数值精度 等宽松模式差异会以异常形式抛出包含具体路径和值的对比。步骤 1引入依赖MavendependencygroupIdorg.skyscreamer/groupIdartifactIdjsonassert/artifactIdversion1.5.1/versionscopetest/scope!--测试场景建议test scope--/dependency步骤 2实操示例比对差异并输出importorg.skyscreamer.jsonassert.JSONAssert;importorg.skyscreamer.jsonassert.JSONCompareMode;publicclassJsonAssertDemo{publicstaticvoidmain(String[]args){// 待比对的两个JSON字符串结构相同值有差异StringexpectedJson{\name\:\张三\,\age\:20,\address\:{\city\:\北京\},\hobbies\:[\篮球\,\游泳\]};StringactualJson{\name\:\李四\,\age\:20,\address\:{\city\:\上海\},\hobbies\:[\篮球\,\跑步\]};try{// 严格模式字段顺序、数组顺序、值完全一致才通过JSONAssert.assertEquals(expectedJson,actualJson,JSONCompareMode.STRICT);}catch(AssertionErrore){// 捕获差异并输出System.out.println(JSON差异\ne.getMessage());}}}输出结果精准定位差异JSON差异Expected:张三got:李四at path $[name]Expected:北京got:上海at path $[address][city]Expected:游泳got:跑步at path $[hobbies][1]关键配置JSONCompareModeSTRICT严格模式字段顺序、数组顺序、值必须完全一致LENIENT宽松模式忽略字段顺序数组顺序仍校验NON_EXTENSIBLE不允许实际 JSON 包含预期外的字段IGNORE_ARRAY_ORDER忽略数组元素顺序IGNORE_VALUES只校验结构忽略值的差异2. JsonUnit更友好的测试 APIJsonUnit 基于 JSONassert 和 Jackson 封装API 更简洁差异输出更易读支持 assertThat 风格的断言符合 BDD 测试习惯。步骤 1引入依赖dependencygroupIdnet.javacrumbs.json-unit/groupIdartifactIdjson-unit-core/artifactIdversion2.38.0/versionscopetest/scope/dependency!--依赖JacksonJsonUnit底层用Jackson解析--dependencygroupIdcom.fasterxml.jackson.core/groupIdartifactIdjackson-databind/artifactIdversion2.15.2/version/dependency步骤 2实操示例importstaticnet.javacrumbs.jsonunit.assertj.JsonAssertions.assertThatJson;publicclassJsonUnitDemo{publicstaticvoidmain(String[]args){StringexpectedJson{\name\:\张三\,\age\:20,\address\:{\city\:\北京\}};StringactualJson{\name\:\李四\,\age\:21,\address\:{\city\:\北京\}};// 比对并输出差异AssertJ风格assertThatJson(actualJson).isEqualTo(expectedJson).onFailure(failure-System.out.println(JSON差异\nfailure.getMessage()));}}输出结果JSON差异Expectedvalue张三but was李四at path $[name]Expectedvalue20but was21at path $[age]高级用法忽略指定字段// 忽略age字段的差异assertThatJson(actualJson).whenIgnoringPaths(age).isEqualTo(expectedJson);3. Jackson业务开发灵活定制Jackson 是 Java 最主流的 JSON 处理库通过 JsonNode 树模型可完全自定义比对逻辑适合业务开发中需要精细控制差异的场景。步骤 1引入依赖dependencygroupIdcom.fasterxml.jackson.core/groupIdartifactIdjackson-databind/artifactIdversion2.15.2/version/dependency步骤 2自定义比对工具类输出差异路径和值importcom.fasterxml.jackson.databind.JsonNode;importcom.fasterxml.jackson.databind.ObjectMapper;importjava.util.ArrayList;importjava.util.List;publicclassJacksonJsonDiff{privatestaticfinalObjectMapperOBJECT_MAPPERnewObjectMapper();privatestaticfinalListStringDIFFSnewArrayList();// 比对两个JSON字符串返回差异列表publicstaticListStringcompareJson(StringexpectedJson,StringactualJson)throwsException{DIFFS.clear();JsonNodeexpectedNodeOBJECT_MAPPER.readTree(expectedJson);JsonNodeactualNodeOBJECT_MAPPER.readTree(actualJson);compareNodes(,expectedNode,actualNode);returnDIFFS;}// 递归比对JsonNode节点privatestaticvoidcompareNodes(Stringpath,JsonNodeexpected,JsonNodeactual){// 节点类型不同if(expected.getNodeType()!actual.getNodeType()){DIFFS.add(path类型不一致预期expected.getNodeType()实际actual.getNodeType());return;}// 叶子节点值节点if(expected.isValueNode()){if(!expected.equals(actual)){DIFFS.add(path值不一致预期expected.asText()实际actual.asText());}return;}// 对象节点递归比对子字段if(expected.isObject()){expected.fieldNames().forEachRemaining(fieldName-{StringnewPathpath.isEmpty()?$.fieldName:path.fieldName;JsonNodeexpectedChildexpected.get(fieldName);JsonNodeactualChildactual.get(fieldName);if(actualChildnull){DIFFS.add(newPath实际JSON缺失该字段);}else{compareNodes(newPath,expectedChild,actualChild);}});// 检查实际JSON是否有预期外的字段actual.fieldNames().forEachRemaining(fieldName-{if(!expected.has(fieldName)){StringnewPathpath.isEmpty()?$.fieldName:path.fieldName;DIFFS.add(newPath实际JSON包含预期外的字段);}});}// 数组节点递归比对数组元素if(expected.isArray()){intexpectedSizeexpected.size();intactualSizeactual.size();if(expectedSize!actualSize){DIFFS.add(path数组长度不一致预期expectedSize实际actualSize);}// 比对数组元素按索引intmaxSizeMath.max(expectedSize,actualSize);for(inti0;imaxSize;i){StringnewPathpath[i];JsonNodeexpectedChildiexpectedSize?expected.get(i):null;JsonNodeactualChildiactualSize?actual.get(i):null;if(expectedChildnull){DIFFS.add(newPath实际数组多出元素);}elseif(actualChildnull){DIFFS.add(newPath实际数组缺失元素);}else{compareNodes(newPath,expectedChild,actualChild);}}}}// 测试publicstaticvoidmain(String[]args)throwsException{StringexpectedJson{\name\:\张三\,\age\:20,\address\:{\city\:\北京\},\hobbies\:[\篮球\,\游泳\]};StringactualJson{\name\:\李四\,\age\:20,\address\:{\city\:\上海\},\hobbies\:[\篮球\,\跑步\]};ListStringdiffscompareJson(expectedJson,actualJson);System.out.println(JSON差异列表);diffs.forEach(diff-System.out.println(- diff));}}输出结果JSON差异列表-$.name值不一致预期张三实际李四-$.address.city值不一致预期北京实际上海-$.hobbies[1]值不一致预期游泳实际跑步4. Diffuse轻量级结构化差异输出Diffuse 是轻量级工具可输出 JSON 格式的结构化差异报告包含添加 / 修改 / 删除的节点适合需要将差异持久化或传输的场景。步骤 1引入依赖dependencygroupIdme.snov/groupIdartifactIddiffuse/artifactIdversion0.2.0/version/dependency步骤 2实操示例importme.snov.diffuse.Diffuse;importme.snov.diffuse.JsonDiff;publicclassDiffuseDemo{publicstaticvoidmain(String[]args){StringexpectedJson{\name\:\张三\,\age\:20};StringactualJson{\name\:\李四\,\age\:21,\gender\:\男\};// 生成结构化差异报告JsonDiffdiffDiffuse.diff(expectedJson,actualJson);System.out.println(结构化差异报告\ndiff.toJson());}}输出结果JSON 格式{changed:[{path:/name,from:张三,to:李四},{path:/age,from:20,to:21}],added:[{path:/gender,value:男}],removed:[]}选型建议测试场景优先选 JsonUnitAPI 友好或 JSONassert轻量业务开发优先选 Jackson灵活自定义比对规则需要结构化差异输出选 Diffuse特殊需求如忽略数值精度、时间格式基于 Jackson 扩展自定义比对逻辑。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询