2017-06-05 28 views
2

這是我的輸入JSON重命名對象的屬性內部陣列

{ 
"uuid":123, 
"description": [ 
    { 
     "car_name":"Toyota", 
     "saleDate":"23 May 2017" 
    } 
    ] 
} 

預期輸出:

{ 
"uuid":123, 
"description": [ 
    { 
     "name":"Toyota", 
     "saleDate":"23 May 2017" 
    } 
    ] 
} 

規則:.DESCRIPTION [] | = {名稱:.car_name,saleDate}

我能用這個規則達到預期的結果。但是,有沒有辦法可以將'car_name'屬性重命名爲'name',也沒有提及規則中的所有其他屬性(本例中爲'saleDate')。我最終可能會在對象內部有50多個屬性,我不想在規則中提及它們。

數組中可以有多個對象。

回答

1

這是做你想做的嗎?

jq '.description[] 
    |= . + 
     if has("car_name") then {"name":.car_name} 
     else null end 
    | del(.description[].car_name)' 

如果 - 則塊將對象{名稱:.car_name}將描述陣列中的任何對象,該對象具有與名稱「car_name」一鍵和陣列中添加任何內容(零)的任何對象那個名字沒有鑰匙。

德爾函數在路徑表達式.DESCRIPTION []刪除鍵 - 值對。car_name

+0

是的!謝謝。現在似乎很簡單。 –

+0

我的榮幸。 jq很有趣。 – user197693

0

我剛剛瞭解+ =從回答另一個問題。它也適用於這裏。

jq '.description[] |= (select(has("car_name")) += {"name":.car_name} | del(.car_name))' 

select函數選擇符合條件的對象。然後我們添加和刪除這些對象。

+0

是的。但是,我發現這種重命名字段的方法有一個問題。它最終將新領域置於與以前不同的位置。這是因爲我們正在創建一個新領域並刪除舊領域。我希望有一種方法可以實際重命名該字段,從而確保我的輸出json看起來與輸入的屬性順序相似。 –

+0

我不知道jq是否可以做到這一點。它可能;我真的不知道。我想你可以做一些像sed's /「car_name」/「name」/ g' – user197693

+0

查看上面關於jq解決方案的答案。 – user197693

0

這似乎工作,同時保持秩序。

jq '.description[] |= with_entries(.key |= gsub("car_name"; "name"))' 

jq manual解釋了with_entries的作用。

信用達到頂峯answer to a similar question

+0

警告:這可能不僅僅改變名爲「car_name」的鍵。 – peak

+0

好點。謝謝! – user197693

1

爲了保護鍵的順序,同時確保只改變特定的鍵名:

jq '.description[] |= with_entries(if .key == "car_name" then .key = "name" else . end)' 
0

JQ」 .DESCRIPTION [] | = with_entries(如果.KEY == 「car_name」 然後.KEY = 「name」else。end)'