簡體   English   中英

用jq修改嵌套的JSON

[英]Modify Nested JSON with jq

我正在嘗試使用bash / shell腳本中的jq <map>函數修改嵌​​套的JSON對象; 類似於此博客條目,但嘗試將此處的示例改編為嵌套對象。

返回的JSON如下修改:

{
  "name": "vendor-module",
  "dependencies": {
    "abc": {
      "from": "abc@2.4.0",
      "resolved": "https://some.special.url",
      "version": "2.4.0"
    },
    "acme": {
      "from": "acme@1.2.3",
      "resolved": "<CHANGE_THIS>",
      "version": "1.2.3"
    }
  }
}

這是我的嘗試:

modules="`node -pe 'JSON.parse(process.argv[1]).dependencies.$dependency' \
  "$(cat $wrapped)"`"
version="1.2.3"
resolved="some_url"

cat OLD.json | 
  jq 'to_entries | 
       map(if .dependencies[0].$module[0].from == "$module@$version"
          then . + {"resolved"}={"$resolved"}
          else . 
          end
         ) | 
      from_entries' > NEW.json

顯然,這是行不通的。 當我運行腳本時,將創建NEW.json ,但是沒有修改或返回錯誤。 如果我的目標不是嵌套對象(例如"name": "vendor-module" ),則腳本將按預期工作。 我敢肯定有一種方法可以使用本地bash和jq來實現。 任何幫助(帶有適當的轉義)將不勝感激。

更新:

Charles Duffy的答案的幫助下以及他使用sponge建議下,Thnx對我來說很有效的解決方案是:

jq --arg mod "acme" --arg resolved "Some URL" \
   '.dependencies[$mod].resolved |= $resolved' \
   OLD.json | sponge OLD.json

如果知道要更新的依賴項的名稱,則可以將其索引。

$ jq --arg dep "$dep" --arg resolved "$resolved" \
    '.dependencies[$dep].resolved = $resolved' \
    OLD.json > NEW.json

否則,要基於名稱(或其他屬性)修改依賴項,請搜索該依賴項並進行更新。

$ jq --arg version "$version" --arg resolved "$resolved" \
    '(.dependencies[] | select(.version == $version)).resolved = $resolved' \
    OLD.json > NEW.json

對於您現有的樣本數據,滿足以下條件:

jq --arg mod "acme" \
   --arg resolved "some_url" \
  '.dependencies[$mod].resolved=$resolved' \
  <in.json >out.json

...來過濾from ,相反:

jq --arg new_url "http://new.url/" \
   --arg target "acme@1.2.3" \
  '.dependencies=(.dependencies
                  | to_entries
                  | map(if(.value.from == $target)
                        then .value.resolved=$new_url
                        else . end)
                  | from_entries)' \
  <in.json >out.json

暫無
暫無

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

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