簡體   English   中英

用jq替換基於鍵值對的JSON值

[英]Replacing the value of JSON based on key value pair with 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"這樣的索引,因為我總是知道數據類型的位置。

陳述的最簡單,也許最有效的解決方案是:

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

這是基於jtc unix實用程序的替代解決方案:

如果我理解你的問題吧,你想匹配datatype== somedatatype1如果匹配,然后更新頂部namename的兄弟姐妹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 $ 

這是jtc綜合用戶指南

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM