Json

使用 jq 在特定行之前附加一個 json 塊

  • January 18, 2022

我有一個場景,我已經有一個想要使用 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"
 }
}

引用自:https://unix.stackexchange.com/questions/686713