由于jq的比较已经在不考虑键顺序的情况下比较了对象,因此剩下的就是在比较对象之前对对象中的所有列表进行排序。假设您的两个文件在每晚的最新jq上分别命名为
a.json和
b.json:
jq --argfile a a.json --argfile b b.json -n '($a | (.. | arrays) |= sort) as $a | ($b | (.. | arrays) |= sort) as $b | $a == $b'
该程序应使用您要求的相等性定义取决于对象是否相等,返回“ true”或“ false”。
编辑:
(.. | arrays) |=sort在某些情况下,构造实际上并没有按预期工作。这个GitHub问题解释了原因并提供了一些替代方法,例如:
def post_recurse(f): def r: (f | select(. != null) | r), .; r; def post_recurse: post_recurse(.[]?); (post_recurse | arrays) |= sort
应用于上面的jq调用:
jq --argfile a a.json --argfile b b.json -n 'def post_recurse(f): def r: (f | select(. != null) | r), .; r; def post_recurse: post_recurse(.[]?); ($a | (post_recurse | arrays) |= sort) as $a | ($b | (post_recurse | arrays) |= sort) as $b | $a == $b'



