Python 函数根据可选参数数量获取 JSON 值

Python function to get a JSON value based on optional number of arguments

如何创建能够根据提供的参数从 json 中获取特定值的 python 函数?提供的参数的数量应该是可选的,因为我无法提前知道我需要在 json 结构中深入到多深的值。

    def json_get_value(respond, *args):
        
        
        try:
            my_json = json.loads(respond)

        except:
            print("Unable to load JSON")
            return "Error ..."

        try:
            value = my_json[args[0]][args[1]][args[2]]
            return value
        except KeyError: 
            return "None"

answer = json_get_value(respond, "count_categories", 0, "total", ........)        

我的问题是如何更改此行: 值=my_json[args[0]][args[1]][args[2]....] 因此该函数对于任意数量的参数都是通用的,因此对于任意数量的键都可以获得所需的值。我知道如果带有 *args 的情况下经常使用 for 循环,但在这种情况下我不确定如何为此目的使用 for 循环。

非常感谢您的帮助。

一个可能的解决方案是使用您的变量 value 将当前级别保持在您所在的 JSON 树中:

try:
    value = my_json
    for arg in args:
        value = value[arg]
    return value
except KeyError: 
    return "None"

请注意,如果未传递任何参数,此函数只是 returns 已解析的 json 文件。

你可以为此使用递归函数。因此,如果您仍然有 args,请继续深入研究 json。如果您的 args 列表中有一个不在 JSON 中的键,那么 return 一个 None 对象,否则继续向下钻取直到获得数据

jdata = {
    "foo": 1,
    "bar": 2,
    "nest1": {
        "baz": "bar"
    },
    "nest2": {
        "nest3": {
            "nest4": {
                "hello": "world"
            }
        }
    }
}

def get_from_json(jdata: dict, *keys):
    try:
        data = jdata[keys[0]]
    except KeyError:
        return None
    if len(keys) > 1:
        return get_from_json(data, *keys[1:])
    return data

print(get_from_json(jdata, "nest2", "nest3", "nest4", "hello"))
print(get_from_json(jdata, "nest1"))
print(get_from_json(jdata, "nest2", "nest3"))
print(get_from_json(jdata, "val", "boo"))
print(get_from_json(jdata, "nest2", "nest3", "someval"))

输出

world
{'baz': 'bar'}
{'nest4': {'hello': 'world'}}
None
None