使用./jq按值过滤

时间:2015-11-18 16:10:19

标签: json jq

考虑到尺寸的输入:

[
  {
    "stock": 1,
    "sales": 0,
    "sizes": [
      {
        "countries": ["at", "be", "ch", "cy", "de", "ee", "es", "fi", "gr", "ie", "lu", "lv", "nl", "pl", "pt", "se", "si", "sk"],
        "size": "EU 45,5"
      },
      {
        "countries": ["it"],
        "size": "EU 45,5"
      },
      {
        "countries": ["fr"],
        "size": "EU 45,5"
      },
      {
        "countries": ["gb"],
        "size": "EU 45,5"
      }
    ]
  }
]

我希望得到的结构与countries没有“de”(德国)的结构相同,并删除字段完整。期待这样的事情:

[
  {
    "stock": 1,
    "sizes": [
      {
        "size": "EU 45,5"
      }
    ]
  }
]

我试过了:

map(.sizes[] |= select(.countries | join(",") | contains("de"))) | map({ stock, sizes })

但过滤器无法正常工作,抛出jq: error (at <stdin>:48): Cannot iterate over null (null)

尝试hasincontainsinside,似乎没有任何效果。

另外,如何过滤哪个字段?仍有map({ stock, sizes })个国家/地区。我可以做map({ stock, sizes: { size } })之类的事情吗?

1 个答案:

答案 0 :(得分:1)

这是一个回答你的主要问题的单行 - 如果你看不清楚它是如何工作的,试着把它分成不同的部分:

map( .sizes |= map( select(.countries | index("de") ) | del(.countries) ))

关于字段的选择,您可以使用上面的del / 1,或者有时只使用{key1, key2}这样的表达式就可以了。还要考虑这个函数和以下示例:

def query(queryobject):
  with_entries( select( .key as $key | queryobject | has( $key ) ));

示例:

$ jq -c -n '{"a": 1, "b": null, "c":3} | query( {a,b,d} )'
{"a":1,"b":null}