9

我有一个要测试的休息 API,我必须比较两个 json 响应。您可以在下面找到该文件的结构。要比较的两个文件应包含相同的元素,但顺序可能不同。不幸的是,名称、类型(简单、数组)和键的数量(根、节点XYZ)也是未知的。

{"root": [{
   "node1": "value1",
   "node2": "value1",
   "node3":    [
            {
         "node311": "value311",
         "node312": "value312"
      },
            {
         "node321": "value321",
         "node322": "value322"
      }
   ],
   "node4":    [
            {
         "node411": "value411",
         "node412": "value413",
         "node413": [         {
            "node4131": "value4131",
            "node4132": "value4131"
         }],
         "node414": []
      }
      {
         "node421": "value421",
         "node422": "value422",
         "node423": [         {
            "node4231": "value4231",
            "node4232": "value4231"
         }],
         "node424": []
      }]
   "node5":    [
      {"node51": "value51"},
      {"node52": "value52"},
   ]
}]}

我在 Groovy 中找到了一些有用的信息 - 比较两个 JSON 对象(相同的结构)并返回包含差异的 ArrayList 从 Json Response Groovy 获取节点 :我如何使用键的值搜索 json 并在 groovy 中找到它的子对象, 但我无法将其组合到一个解决方案。我认为解决方案可能如下所示:

take root
get root children names
check if child has children and get their names
do it to the lowest leve child

有了所有名称,比较应该很容易(我猜)不幸的是我没有设法获得根目录下的密钥

4

2 回答 2

14

只需比较 slurped 的地图:

def map1 = new JsonSlurper().parseText(document1)
def map2 = new JsonSlurper().parseText(document2)

assert map1 == map2
于 2015-10-29T09:51:15.810 回答
5

试试 JSONassert 库:https ://github.com/skyscreamer/JSONassert 。然后你可以使用:

JSONAssert.assertEquals(expectedJson, actualJson, JSONCompareMode.STRICT)

您将获得格式良好的增量,例如:

java.lang.AssertionError: Resources.DbRdsLiferayInstance.Properties.KmsKeyId
Expected: kms-key-2
     got: kms-key
于 2016-09-15T12:33:15.360 回答