Json
使用 jq 在特定行之前附加一個 json 塊
我有一個場景,我已經有一個想要使用 jq 打開和編輯的 json 文件。
json 文件(temp.json):
{ "a":{ "keya" : "abc", "keyb" : "xyz" }, "c":{ "keyc" : "yyy" } }
在這裡,我想通過搜尋在塊之前附加另一個 json 對象
c
,基本上是在最後一個對象之前附加值,在這種情況下,最後一個對象將始終是c
"b":{ "keyb" : "yop" }
我實現了使用 jq 插入塊但不在所需位置。
jq '. |= . + {"b":{ "keyb" : "yop" }}' temp.json
任何幫助都會很棒
您可以使用
jq
’-S
選項對鍵進行排序。例如$ jq -S '. |= . + {"b":{ "keyb" : "yop" }}' temp.json { "a": { "keya": "abc", "keyb": "xyz" }, "b": { "keyb": "yop" }, "c": { "keyc": "yyy" } }
對像是未排序的鍵集合。對於讀取 JSON 文件的應用程序來說,鍵的順序*確實無關緊要。*如果您想要有序數據,請考慮改用數組。
以下是分步解決方案。最終程式碼在最後。
由於數組是有序的,我們可以使用以下方法將頂級對象轉換為鍵和值的有序數組
to_entries
:$ jq 'to_entries' file [ { "key": "a", "value": { "keya": "abc", "keyb": "xyz" } }, { "key": "c", "value": { "keyc": "yyy" } } ]
我們可以在這個數組的最後一個元素之前插入東西。
.[:-1]
在這裡,我使用第一個元素(除了最後一個原始元素之外的所有元素)、新元素和最後一個原始最後一個元素( )的切片來重寫“條目”數組.[-1]
。$ jq 'to_entries | . |= .[:-1] + [ { key: "b", value: { keyb: "yop" } }, .[-1] ]' file [ { "key": "a", "value": { "keya": "abc", "keyb": "xyz" } }, { "key": "b", "value": { "keyb": "yop" } }, { "key": "c", "value": { "keyc": "yyy" } } ]
然後我們可以將其轉換回其原始形式,希望
from_entries
不會改變鍵的順序:$ jq 'to_entries | . |= .[:-1] + [ { key: "b", value: { keyb: "yop" } }, .[-1] ] | from_entries' file { "a": { "keya": "abc", "keyb": "xyz" }, "b": { "keyb": "yop" }, "c": { "keyc": "yyy" } }
在命令行中將新元素作為鍵和 JSON 對象:
$ jq --arg key 'yellow' --argjson value '{ "type": "color" }' 'to_entries | . |= .[:-1] + [ { key: $key, value: $value }, .[-1] ] | from_entries' file { "a": { "keya": "abc", "keyb": "xyz" }, "yellow": { "type": "color" }, "c": { "keyc": "yyy" } }