结合使用jq验证JSON内容的多个测试

时间:2016-02-24 19:49:12

标签: json linux bash jq

我有以下JSON对象

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

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

  • 颜色的值为“红色”
  • shapes 不包含值“round”

返回的结果应为 true false

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

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

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

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:2)

测试一组条件的正确方法是使用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)