注意,我只想在一个较大的JSON Blob中更改部分JSON数据。在JSON Blob的深处,有一个对象数组。这些对象具有不同的属性,但是我可以通过标题来标识要更改的对象。我想用jq
来做到这一点。
这是一个示例JSON:
{
"propA" : "valA",
"anArrayOfObjs" : [
{
"title" : "blah",
"objA" : {
"objB" : {
"propA" : "valA",
"propB" : "valB"
}
}
},
{
"title" : "welcome",
"objA" : {
"objB" : {
"propA" : "valA",
"propC" : "valC"
}
}
},
{
"objA" : {
"objB" : {
"propA" : "valA",
"propD" : "valD"
}
}
}
]
}
我只想为objA.objB.propA
的{{1}}中的对象更改anArrayOfObjs
的值。
感谢您提供的任何提示。
答案 0 :(得分:2)
.path.to.anArrayOfObjs |= map(
select(.title == "welcome").objA.objB.propA = "new value"
)
要修改多个属性,请执行以下操作:
.path.to.anArrayOfObjs |= map(
select(.title == "welcome").objA.objB |= (
.propA = "new value" | .propC = "new value"
)
)
答案 1 :(得分:-1)
即使您想使用jq,也让我向您展示另一种方法-使用基于步行路径的Unix实用程序 jtc
。
要直接在文件中修改值,如下所示:
bash $ jtc -w'<anArrayOfObjs>l [title]:<welcome> [-1] [objA] [objB] [propA]' -u'"new value"' -f blob.json
bash $
bash $
bash $ jtc blob.json
{
"anArrayOfObjs": [
{
"objA": {
"objB": {
"propA": "valA",
"propB": "valB"
}
},
"title": "blah"
},
{
"objA": {
"objB": {
"propA": "new value",
"propC": "valC"
}
},
"title": "welcome"
},
{
"objA": {
"objB": {
"propA": "valA",
"propD": "valD"
}
}
}
],
"propA": "valA"
}
bash $
PS>披露:我是jtc
工具的创建者