如何使用jq修改(即更改部分JSON,但保留其余JSON相同)对象数组中的属性

时间:2019-05-20 14:22:30

标签: json jq

注意,我只想在一个较大的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的值。

感谢您提供的任何提示。

2 个答案:

答案 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工具的创建者