使用jq替换基于键值对的JSON值

时间:2019-03-20 09:25:44

标签: json bash jq

我有一个具有以下结构的JSON

{
   "name": "name",
   "id": [
        "abcdef"
   ],
   "input_dataobjects": [
     {
        "id": "someid1",
        "name": "somename1",
        "provider": "someprovider",
        "datatype": "somedatatype1"
    },
    {
        "name": "some_name2",
        "datatype": "some_datatype2",
        "id": "some_id2"
    }
  ]
}

我要实现的目标

input_dataobjects中,如果是datatype == somedatatype1,则是name = sonemewname1

我可以使用input_dataobjects的索引,因为我的json始终具有相同的结构。但是,通过解析input_dataobjects并找到要替换的索引,是否有其他方法可以实现它呢?我正在使用jq进行JSON操作。

我尝试使用像.input_dataobjects[0].name="someting"这样的索引,因为我总是知道数据类型的位置。

2 个答案:

答案 0 :(得分:2)

针对所述问题的最简单,也许是最有效的解决方案是:

.input_dataobjects |=
  map( if .datatype == "somedatatype1"
       then .name = "sonemewname1"
       else . end )

答案 1 :(得分:0)

这是基于 jtc Unix实用程序的替代解决方案:

如果我理解您的问题是对的,那么您想匹配datatype== somedatatype1,如果匹配,然后用name的{​​{1}}兄弟姐妹更新顶部的name?< / p>

如果是这样,则基于datatype的解决方案如下:

jtc

如果您只想更新/更改记录的同级bash $ <file.json jtc -w'[name]' -u'[datatype]:<somedatatype1>[-1][name]' { "id": [ "abcdef" ], "input_dataobjects": [ { "datatype": "somedatatype1", "id": "someid1", "name": "somename1", "provider": "someprovider" }, { "datatype": "some_datatype2", "id": "some_id2", "name": "some_name2" } ], "name": "somename1" } bash $ ,请按以下方式运行:

name

这是bash $ <file.json jtc -w'[datatype]:<somedatatype1>[-1][name]' -u'"sonemewname1"' { "id": [ "abcdef" ], "input_dataobjects": [ { "datatype": "somedatatype1", "id": "someid1", "name": "sonemewname1", "provider": "someprovider" }, { "datatype": "some_datatype2", "id": "some_id2", "name": "some_name2" } ], "name": "name" } bash $ 全面的user guide