在JQ中的数组元素之间复制字段



我对JQ比较陌生,这可能是一个简单的问题。

我有一个大而漂亮的嵌套JSON文件,其中包含数千个资产。每个资源始终包含一个数组,其中包含两个对象(一个母对象和一个子对象(。

{
"data": [
{
"assets": {
"array": [
{
"id": "7978918",
"labels": {
"text": "mother",
"value": true
},
"properties": {
"context_ids": [],
"parent": null
}
},
{
"id": "caa17b2a-4582-4d13-b891-2607e4ba33c6",
"labels": {
"text": "child",
"value": true
},
"properties": {
"context_ids": [],
"parent": null
}
}
]
}
}
]
}

我想做的是将id从母对象复制到子对象的父字段中。

{
"data": [
{
"assets": {
"array": [
{
"id": "7978918",
"labels": {
"text": "mother",
"value": true
},
"properties": {
"context_ids": [],
"parent": null
}
},
{
"id": "caa17b2a-4582-4d13-b891-2607e4ba33c6",
"labels": {
"text": "child",
"value": true
},
"properties": {
"context_ids": [],
"parent": "7978918"
}
}
]
}
}
]
}

到目前为止,我得到了

cat test.json | jq '.data[].assets.array[]|=(.properties.parent=.id|select(.labels.text=="mother"))' |less

但是,这当然只是将母亲id复制到母亲对象的parent字段中,并完全删除子对象。

我也试过

cat test.json | jq '.data[].assets.array[].properties += {"parent": .data[].assets.array[0].id} |less

乍一看,这似乎是正确的,但似乎创建了一个从未停止的奇怪循环,并创建了越来越大的JSON。

假设第一个元素总是母元素,这应该很好:

.data[].assets.array |= (.[1].properties.parent = .[0].id)

在线演示

否则,首先按labels.text对它们进行排序,使它们始终处于特定索引处。

.data[].assets.array |= (sort_by(.labels.text) | .[0].properties.parent = .[1].id)
jq '.data |= map(.assets.array | .[1].properties.parent = .[0].id)' test.json

最新更新