使用 jq 展平 JSON 对象嵌套数组中的属性数组

Flatten array for properties in nested array of JSON objects using jq

拥有 JSON 和(简化的)Jira 数据,例如:

{
    "issues": [
        {
            "key": "TEST-A",
            "fields": { "issuelinks": [] }
        },
        {
            "key": "TEST-B",
            "fields": {
                "issuelinks": [
                    { "inwardIssue": { "key": "TEST-1" } },
                    { "outwardIssue": { "key": "TEST-2" } },
                    { "outwardIssue": { "key": "TEST-3" } }
                ]
            }
        }
    ]
}

想要得到这样的输出:

[
    { "key": "TEST-A", "inward": null, "outward": null },
    { "key": "TEST-B", "inward": ["TEST-1"], "outward": ["TEST-2", "TEST-3"] }
]

尝试过(暂时忽略内部链接):

cat data.json | \
jq '.issues[] | {"key":.key, "outward":.fields.issuelinks[].outwardIssue.key }'

但我得到:

{ "key": "TEST-B", "outward": "TEST-1" }
{ "key": "TEST-B", "outward": "TEST-2" }
{ "key": "TEST-B", "outward": null }

注意:希望 1) TEST-A 用于最后一个,2) TEST-2TEST-3 用于前两个,并且希望 3) 具有 TEST-2TEST-3 组合成一个数组。

建议?

让我们从您第一次尝试的变体开始:

.issues[]
 | {key,
   inward: .fields.issuelinks|map(.inwardIssue.key // empty),
   outward: .fields.issuelinks|map(.outwardIssue.key // empty) }

对于你的例子,这会产生:

{"key":"TEST-A","inward":[],"outward":[]}
{"key":"TEST-B","inward":["TEST-1"],"outward":["TEST-2","TEST-3"]}

因此需要进行两次维修才能达到既定目标:

  1. 生成数组(例如,将上述表达式括在方括号中)
  2. 用 null 替换空数组。

(2) 是可疑的但很容易实现,例如使用下面定义的辅助函数。

解决方案

def extract(f): map(f // empty) | if length ==0 then null else . end;

.issues
| map(
   {key,
    inward: .fields.issuelinks|extract(.inwardIssue.key),
    outward: .fields.issuelinks|extract(.outwardIssue.key)})

警告

如果 extract 应该保留 nullfalse 值,那么它的 def 应该相应地修改。