Posts Tagged ‘deep merge’

Modify Json file

shtzeng Posted in Research,Tags: , ,
0

最近在陪著弄 nodejs 的東西
有個任務就是隨著不同環境就 deploy 不同設定
這要是普通的檔案就簡單了
可是 nodejs 是 json 格式的
瞎攪和是不行的

我們有以下原始資料 origin.json

{
  "key_c": {
    "key_c_b": "value_c_b",
    "key_c_a": "value_c_a"
  },
  "key_b": {
    "key_b_a": "value_b_a"
  },
  "key_a": "value_a"
}

然後想要修改的資料 modify.json

{
  "key_d": "new_value_d",
  "key_c": {
    "key_c_c": "add_value_c_b",
    "key_c_a": "modify_value_c_a"
  },
  "key_b": {
    "key_b_b": "add_value_b_a"
  },
  "key_a": "modify_value_a"
}

一開始一直在琢磨 jq 的方法
摸來摸去最多也只做得到

jq -s add modify.json origin.json
{
  "key_d": "new_value_d",
  "key_c": {
    "key_c_b": "value_c_b",
    "key_c_a": "value_c_a"
  },
  "key_b": {
    "key_b_a": "value_b_a"
  },
  "key_a": "value_a"
}

有值的都無法覆蓋
好吧,其實上面的方法是錯的
應該要是指令反過來比較趨近我們想要的

jq -s add origin.json modify.json
{
  "key_d": "new_value_d",
  "key_c": {
    "key_c_c": "add_value_c_b",
    "key_c_a": "modify_value_c_a"
  },
  "key_b": {
    "key_b_b": "add_value_b_a"
  },
  "key_a": "modify_value_a"
}

這也不對啊,原本的值都不見了,而我只想修改某些項目
後來找到了這個方法,安裝 npm 的 json

npm install -g json

之後就可以用 json 來處理這個問題了

cat origin.json modify.json | json --deep-merge
{
  "key_a": "modify_value_a",
  "key_b": {
    "key_b_a": "value_b_a",
    "key_b_b": "add_value_b_a"
  },
  "key_c": {
    "key_c_a": "modify_value_c_a",
    "key_c_b": "value_c_b",
    "key_c_c": "add_value_c_b"
  },
  "key_d": "new_value_d"
}

看起來就比較對了
要修改的修改
要新增的新增

Json 真是博大精深超難搞的
我還是敬而遠之吧 XD