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
如何创建能够根据提供的参数从 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