Groovy 比较两个带有未知节点名称和值的 json

Posted

技术标签:

【中文标题】Groovy 比较两个带有未知节点名称和值的 json【英文标题】:Groovy compare two json with unknown nodes names and values 【发布时间】:2016-01-29 09:27:21 【问题描述】:

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

"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 - compare two JSON objects (same structure) and return ArrayList containing differences Getting node from Json Response Groovy : how do i search json with key's value and find its children in groovy 但我无法将它结合到一个解决方案中。 我认为解决方案可能如下所示:

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

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

【问题讨论】:

【参考方案1】:

只要比较一下slurped地图:

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

assert map1 == map2

【讨论】:

完成了这项工作,有什么建议可以从这个比较中提取增量吗? 你需要写一些东西,走地图,找出差异所在...... 如果相应文档中的 Json 字段不按顺序限制此方法的有用性,则该断言将不起作用。 @tim_yates,简单而好的解决方案。如何在比较时忽略某些字段,例如日期、ID 等?是否需要遍历地图并进行自定义比较?或任何简单的方法? 如果两个映射中相同键的顺序不同,它会断言它是相同的吗?【参考方案2】:

试试 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

【讨论】:

以上是关于Groovy 比较两个带有未知节点名称和值的 json的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法在 php 代码中显示未知的名称和值变量?

Groovy-获取BeanInfo Props的名称类型和值

按列和值比较两个 csv 文件并显示不同值的行号 [关闭]

使用 JsonSlurper 和未知“字符串”的 JSON 到 Groovy

球拍-比较列表和值的两个列表问题

JS数据类型和堆栈+变量比较和值的复制+参数传递和类型检测