使用 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-2
和 TEST-3
用于前两个,并且希望 3) 具有 TEST-2
和 TEST-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"]}
因此需要进行两次维修才能达到既定目标:
- 生成数组(例如,将上述表达式括在方括号中)
- 用 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
应该保留 null
和 false
值,那么它的 def 应该相应地修改。
拥有 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-2
和 TEST-3
用于前两个,并且希望 3) 具有 TEST-2
和 TEST-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"]}
因此需要进行两次维修才能达到既定目标:
- 生成数组(例如,将上述表达式括在方括号中)
- 用 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
应该保留 null
和 false
值,那么它的 def 应该相应地修改。