当前位置: 首页 > 面试题库 >

使用jq或备用命令行工具比较JSON文件

赫连坚
2023-03-14
问题内容

是否有任何命令行实用程序可用于查找两个JSON文件是否相同,且字典内键和列表内元素顺序不变?

可以使用jq其他等效工具完成此操作吗?

例子:

这两个JSON文件是相同的

A

{
  "People": ["John", "Bryan"],
  "City": "Boston",
  "State": "MA"
}

B

{
  "People": ["Bryan", "John"],
  "State": "MA",
  "City": "Boston"
}

但是这两个JSON文件是不同的:

A

{
  "People": ["John", "Bryan", "Carla"],
  "City": "Boston",
  "State": "MA"
}

C

{
  "People": ["Bryan", "John"],
  "State": "MA",
  "City": "Boston"
}

那将是:

$ some_diff_command A.json B.json

$ some_diff_command A.json C.json
The files are not structurally identical

问题答案:

由于jq的比较已经在不考虑键顺序的情况下比较了对象,因此剩下的就是在比较对象之前对对象中的所有列表进行排序。假设您的两个文件在每晚的最新jq上分别命名为a.jsonb.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'


 类似资料:
  • 是否有任何命令行实用工具可以用来查找两个JSON文件是否具有字典内键和列表内元素顺序的不变性? 这可以用或其他等效工具来完成吗? 这两个JSON文件是相同的 : 那就是:

  • 简介 我们基于Python SDK实现了命令行工具cloudml,可以方便使用访问Xiaomi Cloud-ML服务。 由于sdk的接口更新较快,命令的使用方式可以通过-h选项获取最新的使用方法。 初始化配置文件 cloudml init 查看帮助 cloudml -h TrainJob相关命令 列举训练job cloudml jobs list 提交训练job cloudml jobs s

  • 使用外置比较工具 选项--diff-cmd和--diff3-cmd的形式相似,也有类似名称的运行配置参数(见“配置”一节),这会导致一个错误的观念,也就是在Subversion中使用外置的比较(或“diff”)和合并工具会非常的容易,虽然Subversion可以使用大多数类似的工具,但是设置这些工具绝非易事。 Subversion和外置比较和合并工具的接口可以追溯到很久以前,当时Subversio

  • 工欲善其事,必先利其器。学好SQLite的命令行工具,对于我们学习SQLite本身而言是非常非常有帮助的。最基本的一条就是,它让我们学习SQLite的过程更加轻松愉快。言归正传吧,在SQLite的官方下载网站,提供了支持多个平台的命令行工具,使用该工具我们可以完成大多数常用的SQLite操作,就像sqlplus之于Oracle。以下列表给出了该工具的内置命令: 命令名 命令说明 .help 列出所

  • 命令行工具 meteor help 获取 meteor 命令行使用帮助。运行 meteor help 会列出meteor所有命令。运行meteor help <command>会打印出关于meteor <command>的详细帮助。 meteor create <name> 创建一个名为<name>的子目录,并在里面新建一个Meteor应用。 met

  • web3j的完全jar文件分发包对每一次发布都提供命令行工具。命令行允许你从终端(terminal)使用web3j的一些功能: 这些工具提供: 钱包创建 钱包密码管理 从一个钱包转移到另一个钱包以太币 solidity智能合约封装包的产生 命令行工具可以从github项目存储库的releases页面下载zipfile/tarball包,或者通过源代码自己编译获得;OS X用户也可以通过Homebr