值是列表时匹配

Matching When Value Is List

我有一个与此类似的 API 转储文件。

{
  "abc": {
    "Code": "ABC",
    "Type": []  },
  "def": {
    "Code": "DEF",
    "Type": [
      "A"
    ]
  },
  "ghi": {
    "Code": "GHI",
    "Type": [
      "B"
    ]
  },
  "jkl": {
    "Code": "JKL",
    "Type": [
      "A",
      "B"
    ]
  },
   "mno": {
    "Code": "MNO",
    "Type": [ "Universal" ]
  }
}</pre>

我正在尝试提取对象,并根据某些类型匹配获取代码键。

例如。 尝试在 Type 匹配“A”、“B”、“A、B”或 Universal 的地方,我得到的对象包含两者,或在某些情况下不包含任何内容。

这是我试过的。

jq -r '.[] | select(.Type[] == "A") | .Code' /tmp/test.json</pre>

我明白了

DEF
JKL
意外匹配类型 ["A"} 和类型 ["A", "B"]
jq -r '.[] | select(.Type[] == "B") | .Code' /tmp/test.json</pre>
我明白了。
GHI
JKL
意外匹配类型 ["B"} 和类型 ["A", "B"]
jq -r '.[] | select(.Type[] == "A, B") | .Code' /tmp/test.json</pre>
什么都不匹配。

这按预期工作。

jq -r '.[] | select(.Type[] == "Universal") | .Code' /tmp/test.json</pre>
MNO

jq程序

.[] | select(any(.Type[]; IN("A","B","A, B","通用"))) | .代码

产生:

"DEF"
"GHI"
"JKL"
"MNO"

如果您想要完全匹配,请将以下内容保存到 script.jq 中:

.[] | select(.Type == $match) | .Code

然后用

测试
$ jq -r --argjson match '["A"]' -f script.jq test.json
DEF
$ jq -r --argjson match '["B"]' -f script.jq test.json
GHI
$ jq -r --argjson match '["A", "B"]' -f script.jq test.json
JKL