Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用变量访问JSON字段_Python_Json_Python 3.x - Fatal编程技术网

Python 如何使用变量访问JSON字段

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']) 我尝试了以下方法

我试图通过定义一个查询字符串列表来访问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'])
我尝试了以下方法,但无效:

    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))