作為json示例,我有這個:
{
"id": "foo",
"items": [
{
"id": "aaa",
"colour": "blue"
},
{
"id": "bbb",
"colour": "red",
}
]
}
在 Python 中將 json 讀入字典后:
我想要做的是一個接收要填充的欄位和要設定的值的函式 例如:
func(json_dict, 'items[0].colour', 'green')
或者
功能(json_dict,'id','bar')
挑戰是對任何深度的 json 執行此操作。但我不知道我可以做多動態:
json_dict['items'][0]['colour'] = 'green'
json_dict['id'] = 'bar'
uj5u.com熱心網友回復:
決議路徑并定義要遍歷的鍵陣列。然后遞回找到最后一個鍵并設定值。
def set_val(json_obj, path, val):
path_arr = []
for _, k, i in re.findall(r'((\w )(\[\d \])?\.?)', path):
path_arr.append(k)
if i: path_arr.append(int(i[1:-1]))
def _get(c_path, curr=json_obj):
if len(c_path) == 1: curr[c_path[0]] = val
else: _get(c_path[1:], curr[c_path[0]])
_get(path_arr)
my_json = {'a': {'b': [1, 2, {'x': 2}]}}
set_val(my_json, 'a.b[2].x', 5)
print(my_json) # ==> {'a': {'b': [1, 2, {'x': 5}]}}
uj5u.com熱心網友回復:
這是正則運算式方法的一種替代方法。但是,一個小缺點是您不能再使用'a.b[2].x'語法。
from typing import Tuple, Union
def set_val(d, path, val):
*paths, last_path = _get_dot_path(path)
path_dict = d
try:
for i, p in enumerate(paths):
path_dict = path_dict[p]
path_dict[last_path] = val
except (KeyError, IndexError, TypeError):
# TODO use variables i and p, if needed
raise
def _get_dot_path(path: str) -> Tuple[Union[str, int], ...]:
return tuple([int(s) if s.lstrip('-').isdecimal() else s
for s in path.split('.')])
my_json = {'a': {'b': [1, 2, {'x': 2}]}}
set_val(my_json, 'a.b.2.x', 5)
print(my_json) # {'a': {'b': [1, 2, {'x': 5}]}}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/358212.html
上一篇:字典串列Python:如果現有的鍵、值對匹配,則將新的鍵、值對附加到字典
下一篇:根據鍵值拆分字典
