簡體   English   中英

在bash中使用jq更改json

[英]changing the json using jq in bash

我有以下json

{
    "name" : "qwerty",
    "values" :[
    {
        "field1" : [
            "val1"
            ],
        "field2" : [
            "val2"
            ],
        "name1" : [["a", "b"], ["c", "d"]]
    },
    {
        "field1" : [
            "val3"
            ],
        "field2" : [
            "val4"
            ],
        "name1" : [["a", "b"], ["c", "d"]]
    },
    {
        "field1" : [
            "val5"
            ],
        "field2" : [
            "val6"
            ],
         "name1" : [["a", "b"], ["c", "d"]]
    }
    ]
}

我需要在bash中使用jq將上面的json更改為以下內容

{
    "name" : "qwerty",
    "values" :[
    {
        "field1" :  "val1",
        "field2" :  "val2",
        "new_name" : [["a", "b"], ["c", "d"]]
    },
    {
        "field1" : "val3",
        "field2" : "val4",
        "new_name" : [["a", "b"], ["c", "d"]]
    },
    {
        "field1" : "val5",
        "field2" : "val6",
        "new_name" : [["a", "b"], ["c", "d"]]
    }
    ]

}

在這里,我面臨以下問題:

我嘗試使用標記值解析內部json並用空格替換'['']',但是,當我嘗試以列表的形式將“值”放在變量中時,jq是美化然后顯示每個新行作為數組的元素。

值數組中的內部jsons數量不固定。

有人可以幫我構建jash語句,以便在bash中運行以進行必要的更改。

下面的代碼段可以做你想要的:

jq '{
    "name": .name, 
    "values": [ 
        {
            "field1" : .values[0].field1[0], 
            "field2" : .values[0].field2[0],
            "New_name": .values[0].name1  
        },
        {
            "field1" : .values[1].field1[0],
            "field2" : .values[1].field2[0],
            "new_name" : .values[1].name1
        },
        {
            "field1" : .values[2].field1[0],
            "field2" : .values[2].field2[0],
            "new_name" : .values[2].name1
        }
    ]  
}' < /tmp/input.json

編輯

由於對象的數量不固定,下面的代碼段將執行:

jq '{ 
        "name" : .name,
        "values" : [
                .values[] as $in | 
                { 
                        "field1" : $in.field1[0],
                        "field2" : $in.field2[0],
                        "new_name" : $in.name1 
                }
        ]

}' < /tmp/input.json

這應該工作; 我不確定是否有辦法重構field1field2的賦值:

jq '.values[] |= (.field1=.field1[0] | .field2=.field2[0])' tmp1.json

這是另一種解決方案。

  .values |= map({
     field1:   .field1[0],
     field2:   .field2[0],
     new_name: .name1
  })

暫無
暫無

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

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