小技巧 - 處理 JSON 檔案之二

這篇主要是延續前篇的 Tip - 處理 JSON 檔案,前篇寫完以後,突然想到,如果要移除其中一個鍵值該怎麼辦?

例如:

{
    "force": true,
    "foo": "2021-04-10T08:04:12Z",
    "id": 1,
    "name": "server.json"
}

要把 ‘foo’ 一除掉,變成

{
    "force": true,
    "id": 1,
    "name": "server.json"
}

一開始我是想到可以找找看 json_query 是否可以處理。

這邊要離題帶一下,Ansible 的 json_query 函數,語法跟 jq 不太一樣,他是使用 JMESPath 。 特別離題帶一下的原因是因為,我之前寫的時候就傻傻的以為用 jq 語法就行了,試了許久,才發現不能這樣用。

經過研究之後,發現 json_query 能做的有限,那麼就只能回歸到 Ansible 語法本身了。

Ansible 可以透過 dict2item 這個 filter 來 iterate dictionary,那再搭配前篇提到的 combine ,就可以做到移除鍵值的功能了。

寫法如下

- name: Remove 'foo' in server_conf
  vars:
    new_server_conf: {}
  set_fact:
    new_server_conf: "{{ new_server_conf | combine({item.key: item.value}) }}"
  when: "item.key != 'foo'"
  loop: "{{ server_conf | dict2items }}"

- name: Display new_server_conf
  debug:
    var: new_server_conf
  1. 使用 loop 搭配 dict2items,來遍訪 server_conf 裡的每個項目。
  2. 宣告 new_server_conf 來放新的值。
  3. 使用 set_fact 搭配 combine,來持續的合併 dictionary
  4. 使用 when 來篩選掉不要的項目

透過這樣的語法,就可以做到移除指定鍵值了。