【问题标题】:Combining multiple tests in validating JSON content with jq结合使用 jq 验证 JSON 内容的多个测试
【发布时间】:2016-02-24 19:49:11
【问题描述】:

我有以下 JSON 对象

{"color": "red", "shapes": [ "square", "triangle" ]}

我想通过以下条件使用jq 验证 JSON 对象:

  • color 的值为“red”
  • 形状不包含值“圆形”

返回的结果应该是 truefalse

我有 2 个 jq 命令来验证这两个条件,但我不确定如何将其组合成 1 个表达式:

json='{"color": "red", "shapes": [ "square", "triangle" ]}'
echo "$json" | jq '.["color"] | test("red")'
echo "$json" | jq 'any(.shapes[]; contains("round"))|not'

任何指点或帮助将不胜感激。

【问题讨论】:

  • 顺便说一句,考虑jq <<<"$json" 而不是echo "$json" | jq,或者--如果您希望与POSIX sh 兼容而不使您的代码不必要地脆弱--printf '%s\n' "$json" | jq。有关echo 命令的详细信息,请参阅pubs.opengroup.org/onlinepubs/009604599/utilities/echo.html,避免它的原因应该是相当明显的。
  • @CharlesDuffy 有趣,tnx 提示

标签: json linux bash jq


【解决方案1】:

测试条件集合的正确方法是使用and

在您的情况下,正确的测试是:

(.color == "red") and (.shapes|index("round") == null)

示例(打字稿):

jq '(.color == "red") and (.shapes|index("round") == null)'
{"color": "red", "shapes": [ "square", "triangle" ]}
true

在 jq 中,not 是一个语法上普通的过滤器,因此您可以将第二个条件写为:(.shapes | index("round") | not)

【讨论】:

    【解决方案2】:

    您可以使用all 简单地验证两个测试是否都返回 true:

    echo '{"color": "red", "shapes": [ "square", "triangle" ]}' |
      jq '[(.["color"] | test("red")),
           (any(.shapes[]; contains("round"))|not)
          ] | all'
    

    创建一个包含每个测试结果的数组,然后将该数组传送到all

    【讨论】:

    • contiains 可能不是最好的选择。一个简单的等号可能会更好。否则"ground" 会失败。
    • 我只是复制了原件,因为我只是展示了如何将两个测试合并到一个 jq 调用中。
    • 这确实正确回答了这个问题。答案是使用给出的元素组成的,这使得它成为正确的答案。虽然,@peak 的回答是首先应该如何构建表达式,并且可能对未来的读者更有教育意义。
    猜你喜欢
    • 1970-01-01
    • 2023-03-22
    • 2020-06-28
    • 1970-01-01
    • 2011-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多