JQ 如何在更新选定对象的同时打印出整个 JSON 文档
JQ How to update selected objects while also printing out the entire JSON document
我正在尝试简单地更新一个数组,同时还打印出完整的 JSON 正文。每当我更新数组时,我只能输出我更新的 JSON 对象,而不是打印整个 JSON 文档,加上更新。
命令:
array='{"uid": "foo123" }, {"uid": "bar123"}'
t=Test
jq --arg title "$t" --arg array "[$array]" \
'. | select(.data[].title == $title) | .alert.notifications = ($array | fromjson)'
输入:
{
"data": [
{
"alert": {
"notifications": [
{
"uid": "foo"
},
{
"uid": "bar"
}
]
},
"title": "Test"
},
{
"alert": {
"notifications": [
{
"uid": "foo1"
},
{
"uid": "bar1"
}
]
},
"title": "Test2"
}
]
}
不需要的输出:
{
"data": [
{
"alert": {
"notifications": [
{
"uid": "foo"
},
{
"uid": "bar"
}
]
},
"title": "Test"
},
{
"alert": {
"notifications": [
{
"uid": "foo1"
},
{
"uid": "bar1"
}
]
},
"title": "Test2"
}
],
"alert": {
"notifications": [
{
"uid": "foo123"
},
{
"uid": "bar123"
}
]
}
}
期望的输出:
{
"data": [
{
"alert": {
"notifications": [
{
"uid": "foo123"
},
{
"uid": "bar123"
}
]
},
"title": "Test"
},
{
"alert": {
"notifications": [
{
"uid": "foo1"
},
{
"uid": "bar1"
}
]
},
"title": "Test2"
}
]
}
我尝试了几种不同的场景,最接近的是不想要的输出。任何帮助将不胜感激!
谢谢,
尝试用 map
:
更新 |=
data
字段
array='{"uid": "foo123" }, {"uid": "bar123"}'
t=Test
jq --arg title "$t" --arg array "[$array]" \
'.data |= map(select(.title == $title).alert.notifications = ($array | fromjson))'
或者,将分配的 LHS 括在括号中以保留上下文:
array='{"uid": "foo123" }, {"uid": "bar123"}'
t=Test
jq --arg title "$t" --arg array "[$array]" \
'(.data[] | select(.title == $title).alert.notifications) = ($array | fromjson)'
反正没必要.|
.
我正在尝试简单地更新一个数组,同时还打印出完整的 JSON 正文。每当我更新数组时,我只能输出我更新的 JSON 对象,而不是打印整个 JSON 文档,加上更新。
命令:
array='{"uid": "foo123" }, {"uid": "bar123"}'
t=Test
jq --arg title "$t" --arg array "[$array]" \
'. | select(.data[].title == $title) | .alert.notifications = ($array | fromjson)'
输入:
{
"data": [
{
"alert": {
"notifications": [
{
"uid": "foo"
},
{
"uid": "bar"
}
]
},
"title": "Test"
},
{
"alert": {
"notifications": [
{
"uid": "foo1"
},
{
"uid": "bar1"
}
]
},
"title": "Test2"
}
]
}
不需要的输出:
{
"data": [
{
"alert": {
"notifications": [
{
"uid": "foo"
},
{
"uid": "bar"
}
]
},
"title": "Test"
},
{
"alert": {
"notifications": [
{
"uid": "foo1"
},
{
"uid": "bar1"
}
]
},
"title": "Test2"
}
],
"alert": {
"notifications": [
{
"uid": "foo123"
},
{
"uid": "bar123"
}
]
}
}
期望的输出:
{
"data": [
{
"alert": {
"notifications": [
{
"uid": "foo123"
},
{
"uid": "bar123"
}
]
},
"title": "Test"
},
{
"alert": {
"notifications": [
{
"uid": "foo1"
},
{
"uid": "bar1"
}
]
},
"title": "Test2"
}
]
}
我尝试了几种不同的场景,最接近的是不想要的输出。任何帮助将不胜感激!
谢谢,
尝试用 map
:
|=
data
字段
array='{"uid": "foo123" }, {"uid": "bar123"}'
t=Test
jq --arg title "$t" --arg array "[$array]" \
'.data |= map(select(.title == $title).alert.notifications = ($array | fromjson))'
或者,将分配的 LHS 括在括号中以保留上下文:
array='{"uid": "foo123" }, {"uid": "bar123"}'
t=Test
jq --arg title "$t" --arg array "[$array]" \
'(.data[] | select(.title == $title).alert.notifications) = ($array | fromjson)'
反正没必要.|
.