2015-10-14 67 views
1

我有一個json文件,其中包含null s作爲值的一些鍵,我想用一些特定的值來替換。如何使用jq將json文檔中的空值替換爲特定值?

鑑於此輸入:

{ 
    "id": null, 
    "rows": [ 
    { 
     "panels": [ 
     { 
      "title": "Panel1", 
      "datasource": null 
     }, 
     { 
      "title": "Panel2", 
      "datasource": null 
     } 
     ] 
    } 
    ] 
} 

我想有

{ 
    "id": null, 
    "rows": [ 
    { 
     "panels": [ 
     { 
      "title": "Panel1", 
      "datasource": "mydb" 
     }, 
     { 
      "title": "Panel2", 
      "datasource": "mydb" 
     } 
     ] 
    } 
    ] 
} 

我目前使用的是什麼

sed 's/"datasource": null/"datasource": "mydb"/' 

這將產生輸出我需要的,但我一直在想在工作中使用sed是件可恥的事情,當有工具如jq可以以更好的方式在JSON上工作。

回答

4

首先,您需要確定要更新的對象。既然你想面板的空數據源設置爲"mydb",你可以這樣做:

$ jq '.rows[].panels[].datasource //= "mydb"' input.json 

如果您想更新任何級別的任何對象的任何datasource屬性,你可以使用..遞歸搜索它們。

$ jq '(.. | select(objects | has("datasource"))).datasource //= "mydb"' input.json 
+0

只有當數據源字段的完整路徑得到修復時纔可以這樣做嗎? – holgero

+1

有辦法讓它更新任何級別的任何對象上的任何'datasource'屬性。我將添加該示例。 –

0

爲了記錄,將所有空值(無論它們出現在何處)的鍵值更改爲其他值也很容易。 jq> 1.5的版本包括一個jq定義的過濾器walk/1,它可以在其他版本的jq中使用(例如通過複製和粘貼)。

例如,要使用改變爲空的所有密鑰值0的步行/ 1:

walk(if type == "object" then with_entries(.value //= 0) else . end) 

這裏是步行的JQ-提供定義/ 1:

def walk(f): 
    . as $in 
    | if type == "object" then 
     reduce keys[] as $key 
     ({}; . + { ($key): ($in[$key] | walk(f)) }) | f 
    elif type == "array" then map(walk(f)) | f 
    else f 
    end; 
0

這裏是其使用tostream減少的setpath的溶液來設置任何葉datasource屬性,其值是null"mydb"

reduce (tostream|select(length==2)) as [$p,$v] (
    . 
; if $p[-1] == "datasource" and $v == null then setpath($p; "mydb") else . end 
) 
相關問題