小技巧 - 處理 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
- 使用 loop 搭配
dict2items
,來遍訪 server_conf 裡的每個項目。 - 宣告 new_server_conf 來放新的值。
- 使用 set_fact 搭配
combine
,來持續的合併 dictionary - 使用 when 來篩選掉不要的項目
透過這樣的語法,就可以做到移除指定鍵值了。