2

我有一个 JSON 文件,例如:

{
    "items": {
        "item1": {
            "thing1": "SomeValue", 
            "thing2": "AnotherValue"
        }, 
        "item2": {
            "thing1": "SomeValue", 
            "thing2": "AnotherValue"
        },
        "item3": {
            "thing1": {
                "moreStuff": "someStuff",
                "evenMoreStuff": "someMoreStuff"
            }
        }
    }
} 

我想通过将字符串列表作为键传递来创建一个通用函数来更新文件中的单个值。

def update_dict(value, keys):
    with open(somePath, "r") as f:
        data = json.load(f)
    
    data[keys[0]][keys[1]][keys[2]] = value

    with open(somePath, "w") as f:
        json.dump(data, f,

value = "AThirdValue"
keys = ["items", "item2", "thing1"]

update_dict(value, keys)

我想不通的是,如果一个人不知道密钥列表的长度,如何做到这一点。例如,这将不起作用:

value = "AThirdValue"
keys = ["items", "item3", "thing1", "moreStuff"]
update_dict(value, keys)

如果我添加另一个深度级别,我不想使用 if 语句来检查长度,然后必须编辑此函数。

4

3 回答 3

1

您可以使用循环来模拟树行走:

def update_dict(value, keys):
    with open(somePath, "r") as f:
        data = json.load(f)

    point = data
    last_key = keys.pop()
    for key in keys:
        point = point[key]
    
    point[last_key] = value

    with open(somePath, "w") as f:
        json.dump(data, f)
于 2021-03-11T19:33:33.923 回答
1

你可以像这样级联键列表的项目

import json

def update_dict(value, keys):
    with open(somePath, "r") as f:
        data = json.load(f)
    
    tmp_data = data
    for key in keys[:-1]:
        tmp_data = tmp_data[key]
    tmp_data[keys[-1]] = value 
    with open(somePath, "w") as f:
        json.dump(data, f)

value = "AThirdValue"
keys = ["items", "item2", "thing1"]

update_dict(value, keys)

其他编码方式

import json

def update_dict(value, *keys):
    with open(somePath, "r") as f:
        data = json.load(f)
    
    tmp_data = data
    for key in keys[:-1]:
        tmp_data = tmp_data[key]
    tmp_data
    tmp_data[keys[-1]] = value 
    with open(somePath, "w") as f:
        json.dump(data, f)

value = "AThirdValue"
update_dict(value, "items", "item2", "thing1")
于 2021-03-11T20:02:33.267 回答
0

使用可变数量的参数。

def functionName(*argument)

代替:

data[keys[0]][keys[1]][keys[2]] = value

和:

def update_dict(value, *keys):
    with open(somePath, "r") as f:
        data = json.load(f)

    # data[keys[0]][keys[1]][keys[2]] = value
    for key in keys:
        data[key] = value

    with open(somePath, "w") as f:
        json.dump(data, f)

value="AThirdValue"
keys = ["items", "item2", "thing1"]

update_dict(value, keys)
于 2021-03-11T19:49:11.047 回答