Jq:在步行期间测试一个字段

时间:2017-02-14 13:52:06

标签: json key traversal jq

请考虑以下jq config:

walk 
( 
  if (type == "object" and .key | test("something")) then 
    del(.) 
  else 
    . 
  end
)

跟随json:

[
  {
    "key": "something",
    "value": "something"
  },
  {
    "key": "another thing",
    "value": "another thing"
  },
  {
    "key": "something",
    "value": "something"
  }
]

但是,jq会抛出以下错误:

  

jq:error(at:13):boolean(false)无法匹配,因为它不是字符串

13是输入的最后一行。它试图匹配什么布尔值?

2 个答案:

答案 0 :(得分:1)

此处不需要walk()。我会像这样使用map()

jq 'map(select(.key!="something"))'

关于您报告的错误,您会错过括号。它应该是:

jq 'walk(if(type == "object" and (.key | test("something"))) then del(.) else . end)'
                                 ^                        ^

答案 1 :(得分:1)

  1. 正如@ hek2mgl所解释的那样,关于错误消息的问题的答案是(X and Y | Z)被解析为(X and Y) | Z

  2. 您的查询的主要问题是del(.)的出现。 "。"在这种情况下引用对象,因此在这里使用del / 1是完全错误的。由于它不清楚你想要做什么,让我冒昧地猜测它是删除对象(。)本身。可以使用empty

  3. 来完成

    walk(if type == "object" and (.key | test("something"))
         then empty
         else . end)
    

    更强大:

    walk(if type == "object" and (.key | (type == "string" and test("something")))
         then empty
         else . end)