我对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