Python 如何使用变量访问JSON字段
我试图通过定义一个查询字符串列表来访问JSON文件中的数据,这样我就可以遍历它们并动态提取数据 在下面的示例中,我试图提取“[1]['name']”并将其作为变量传递Python 如何使用变量访问JSON字段,python,json,python-3.x,Python,Json,Python 3.x,我试图通过定义一个查询字符串列表来访问JSON文件中的数据,这样我就可以遍历它们并动态提取数据 在下面的示例中,我试图提取“[1]['name']”并将其作为变量传递 data_set = {1: [1, {'name':'bob'}, 3], 2: [1, {'name':'bill'}, 3],3: [1, {'name':'fred'}, 3]} for d in data_set: print(data_set[d][1]['name']) 我尝试了以下方法
data_set = {1: [1, {'name':'bob'}, 3], 2: [1, {'name':'bill'}, 3],3: [1, {'name':'fred'}, 3]}
for d in data_set:
print(data_set[d][1]['name'])
我尝试了以下方法,但无效:
query_list = r'[1][''name'']'
print(data_set[d][1]['name'])
首先,属性名称(在本例中为
1
,2
,3
)应包含在JSON数据中的双引号中,如“1”
,“2”
和“3”
。然后使用json.loads
函数以及包含if
条件的游标来提取所需的值,例如
import json
data_set = '{"1": [1, {"name":"bob"}, 3], "2": [1, {"name":"bill"}, 3],"3": [1, {"name":"fred"}, 3]}'
loaded_json = json.loads(data_set)
for i in loaded_json:
if int(i) == 1:
print( loaded_json[i] )
同意。扩展代码后,我在JSON中添加了一个额外的元素。我想把[1]['name']和[3]['city']放在一个字符串列表中,这样我就可以在提取数据的列表中循环。JSON将更加复杂,我将提取大量变量
data_set = '{"1": [1, {"name":"bob"}, 3,{"city":"London"}], "2": [1, {"name":"bill"}, 3,{"city":"Madrid"}],"3": [1, {"name":"fred"}, 3,{"city":"Portland"}]}'
loaded_json = json.loads(data_set)
for i in loaded_json:
print(loaded_json[i][1]['name'])
print(loaded_json[i][3]['city'])
如果您控制字符串,我宁愿使用列表来表示路径,例如
[1,1,'name']
:
def get_nested(value, path):
for p in path:
value = value[p]
return value
然后:
如果您更喜欢函数式,还可以将get\u nested()
定义为:
import functools, operator
def get_nested(value, path):
return functools.reduce(operator.getitem, path, value)
如果您事先不知道data\u set
的键,可以迭代其值并将其传递给get\u nested()
:
我只是想澄清一下。是否有一个类似于
“[1]['name']”“
的字符串,用于深入遍历字典/列表?这个字符串从哪里来?我想定义这个字符串。实际上,它将是一个字符串列表,而实际的JSON将非常复杂。我希望能够轻松定义要从中提取的变量。如果是您定义字符串,我宁愿使用列表,如[1,'name']
,然后对其进行迭代。是的,只要知道深度,这样的列表就可以工作。在某些情况下,JSON需要两个级别,但在其他情况下需要3或4个级别。非常接近。然后我可以循环执行以下调用get_nested。查询=[[1,1,'name'],[1,1,'name'],[1,3,'city']]但是,将迭代第一个变量“d”。您建议我将其作为参数发送到“get_nested”还是在发送之前将其附加到查询变量?@Justin如果您事先不知道d
s,我只需迭代原始dict,并将值作为第一个参数传递到get_nested()
。我将更新示例。在迭代列表时更新列表的第一个元素效果很好。谢谢你的帮助。
import functools, operator
def get_nested(value, path):
return functools.reduce(operator.getitem, path, value)
for val in data_set.values():
for query in queries:
print(get_nested(val, query))