在 Python 中,如何简洁地替换 json 数据中的嵌套值?



这是对 Python 中的扩展,如何简洁地获取 json 数据中的嵌套值?

我从 JSON 加载了数据,并尝试使用列表作为输入来替换任意嵌套值,其中列表对应于连续子级的名称。我想要一个函数replace_value(data,lookup,value(,通过将查找中的每个条目视为嵌套子项来替换数据中的值。

这是我正在尝试执行的操作的结构:

json_data = {'alldata':{'name':'CAD/USD','TimeSeries':{'dates':['2018-01-01','2018-01-02'],'rates':[1.3241,1.3233]}}}
def replace_value(data,lookup,value):
DEFINITION
lookup = ['alldata','TimeSeries','rates']
replace_value(json_data,lookup,[2,3])
# The following should return [2,3]
print(json_data['alldata']['TimeSeries']['rates'])

我能够从 get_value(( 开始,但对如何进行替换感到困惑。我不固定在这种代码结构上,但希望能够以编程方式替换给定连续子项列表和要替换的值的数据中的值。

注意:查找的长度可能为 1

按照查找直到我们从末尾开始第二个,然后将值分配给当前对象中的最后一个查找

def get_value(data,lookup):  # Or whatever definition you like
res = data
for item in lookup:
res = res[item]
return res
def replace_value(data, lookup, value):
obj = get_value(data, lookup[:-1])
obj[lookup[-1]] = value
json_data = {'alldata':{'name':'CAD/USD','TimeSeries':{'dates':['2018-01-01','2018-01-02'],'rates':[1.3241,1.3233]}}}
lookup = ['alldata','TimeSeries','rates']
replace_value(json_data,lookup,[2,3])
print(json_data['alldata']['TimeSeries']['rates']) # [2, 3]

如果您担心列表复制lookup[:-1],可以将其替换为迭代器切片:

from itertools import islice
def replace_value(data, lookup, value):
it = iter(lookup)
slice = islice(it, len(lookup)-1)
obj = get_value(data, slice)
final = next(it)
obj[final] = value

您可以先获取最终子字典的父级,以便可以引用它来更改最终键下该子字典的值:

def replace_value(data, lookup, replacement):
*parents, key = lookup
for parent in parents:
data = data[parent]
data[key] = replacement

因此:

json_data = {'alldata':{'name':'CAD/USD','TimeSeries':{'dates':['2018-01-01','2018-01-02'],'rates':[1.3241,1.3233]}}}
lookup = ['alldata','TimeSeries','rates']
replace_value(json_data,lookup,[2,3])
print(json_data['alldata']['TimeSeries']['rates'])

输出:

[2, 3]

一旦你有了get_value

get_value(json_data, lookup[:-1])[lookup[-1]] = value

最新更新