json - 通过bash检查特定字符串是否在Json文件中
问题描述
可以说这是我的 json 文件内容:
[ { "id":"45" }, { "id":"56" }, { "id":"13" }, { "id":"5" } ]
我想知道 id "13" 是否在 json 文件中。有没有办法做到这一点bash
?
我尝试使用 jq 及其各种不同的变体(例如包含和不包含)运行该命令,但没有任何东西可以为我回答这个查询。
解决方案
注意:当问题关闭时,我在问题中添加了这个答案,以重新打开问题:
(( $(jq < file.json '[.[].id | select(. == "13")] | length') > 0))
OP说它效率低下。我不知道为什么。这是它的作用:
它通过
jq
程序传递 JSON,这是一个 JSON 解析器。bash shell 对 JSON 没有原生理解,因此任何解决方案都将使用外部程序。其他程序会将 JSON 视为文本,并且可能在某些或大多数情况下工作,但最好使用jq
遵循正式 JSON 规范的程序来解析数据。它创建一个数组来捕获...的输出
它循环遍历数组,挑选出所有
id
字段id
如果值为“13” ,则输出该字段的值
它计算数组的长度,即
id
值为“13”的字段数使用 native
bash
,它将输出转换为数字,如果数字大于 0 则评估为 true ,否则为 false 。
我认为您不会发现正式遵循 JSON 规范的更高效的东西。
- 这仅运行 1 个程序,
jq
这是事实上的标准 JSON 处理器。它不是 POSIX 标准(早于 JSON)的一部分,但它是最有可能安装在系统上的 JSON 处理器。 - 这使用本机构
bash
造来解释输出和测试。 - 不会有比
jq
. - 不会有明显更好的
jq
过滤器,因为它将处理整个输入(这就是它的工作方式)并且select
过滤器停止处理未通过测试的对象,即全部或几乎全部。
另一种“峰值”表示更紧凑、更优雅(好东西),但效率并没有显着提高(或降低)。它在帖子中看起来更好,因为很多内容都被遗漏了。完整的测试将是
[[ $(jq < file.json 'any(.[]; .id == "13")') == "true" ]]
实际上,.[];
生成器是不必要的,所以更紧凑的答案是
[[ $(jq < file.json 'any(.id == "13")') == "true" ]]
推荐阅读
- sqlite - 如何将内存中的sqlite数据库保存到perl中的文件中?
- javascript - 为什么 post 方法不会将新对象写入文件?
- visual-studio-2012 - 在 VS Data tools 2012 中调试 SSIS 包时,本地窗口显示空变量
- python - 如何使用python在图像中查找有界区域的RGB值?
- python - 为什么我在尝试使用 Evernote 进行身份验证时收到 KeyError?
- android - 尝试通过(OnItemClickListener)在片段之间添加选定的图像视图,在应用程序崩溃的第二个 ImageView 上
- aws-lambda - 尝试使用无服务器获取 aws lambda
- node.js - 如何在express js中使用特定字段而不是id进行查询
- java - 如何评估一个值是否在 DROOLS 的值列表中
- .net - 如何在 JSON .NET 上对属性名称强制使用引号