判断两个字符串不同的json是否等价(附:将等价但是不同json调整成同一字符串的方法)

本文探讨了在软件和网络测试中如何对比不同格式但等价的JSON对象。介绍了五种方法,包括字符串对比、转换为JSON对象、使用net.sf.json库的hashCode、优化的hashCode比较以及通过排序解决顺序问题。特别指出,net.sf.json库能处理顺序变化,但可能混淆Integer和String类型的hashCode,建议在排序时灵活选择排序规则。
摘要由CSDN通过智能技术生成

在做软件和网络测试的时候,经常需要对排版格式与内部结构顺序不固定的json对象进行分析对比,而json基本语法下,同样的一个json对象,字符串变化可以千变万化,json内各个层字段顺序调转,排版变化,打乱顺序的json数组+多层嵌套,等等各种因素,都会造成对比上的困难。

以下由浅及深谈谈几种方法:(一共五种方法,四和五是无缺陷方法,将json对象转换成多叉树,再对多叉树的各个父节点的子节点左右顺序进行hashCode大小排序,这样不管json顺序或者排版如何变化,最终都将生成唯一的json字符串)

一.字符串对比,外加正则方式对比,因为json字符串可变化方式太多,出错率过高略过不谈。

二.使用json库将json字符串转换成对象,这时候可以完全排除掉空格和换行等等纯排版原因造成的差异.

如需更进一步对比需要转换为json对象后进行递归取出所有键值对,然后通过遍历map对比,缺陷是当存在同名字段或者存在json数组的时候会出现冲突的问题,这个方法适合json层数不多或者不存在同名字段的情况.

三. 使用net.sf.json包,由于net.sf.json包在构造json对象的时候,会在内部进行有序化调整,所以等价的json对象生成的hashCode是完全一致的,可以直接使用 JSONObject.hashCode()对比,而其它包如:com.google.gson包与 vertx.core.json 包无法使用该方法,顺序稍加变化就会改变hashCode.

这是库与库之间构造json对象的数据结构差异.

以下设置了两层嵌套的内部顺序不同但是等价的json字符串

String a= "{\n" +
      "    \"obj_1\": \"name\",\n" +
      "    \"field_1\": \"11\",\n" +
      "    \"list_1\": [\n" +
      "        {\n" +
      "            \"obj_2.1\": \"obj_2.1\",\n" +
      "            \"field_2.1\": \"21\"\n" +
      "        },\n" +
      "        {\n" +
      "            \"obj_2.2\": \"obj_2.2\",\n" +
      "            \"field_2.2\": \"22\"\n" +
      "        },\n" +
      "\t\t[ \n" +
      "\t\t{\n" +
      "            \"obj_2.3.1\": \"obj_2.3.1\",\n" +
      "            \"field_2.3.1\": \"231\"\n" +
      "        },\n" +
      "        {\n" +
      "            \"obj_2.3.2\": \"obj_2.3.2\",\n" +
      "            \"field_2.3.2\": \"232\"\n" +
      "        }\n" +
      "\t\t\n" +
      "\t\t]\n" +
      "    ]\n" +
      "}";
String b="{\n" +
      "    \"field_1\": \"11\",\n" +
      "    \"obj_1\": \"name\",\n" +
      "    \"list_1\": [\n" +
      "        \n" +
      "        {\n" +
      "\t\t    \"field_2.2\": \"22\",\n" +
      "            \"obj_2.2\": \"obj_2.2\"\n" +
      "        },\n" +
      "\t\t\n" +
      "\t\t[ \n" +
      "\t\t{\n" +
      "            \"obj_2.3.1\": \"obj_2.3.1\",\n&#
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值