在Python中循环遍历JSON数组

44

我有以下来自API的数据。 我正在尝试使用Python脚本访问餐厅名称,并使脚本显示它。 这是我的文件:

test.py

with open('data.json') as data_file:    
    data = json.load(data_file)
    for restaurant in data:
        print data ['restaurants'][0]['restaurant']['name']

我的 JSON 文件如下(简化):

    {
  "results_found": 3296,
  "results_start": 0,
  "results_shown": 20,
  "restaurants": [
    {
      "restaurant": {
        "R": {
          "res_id": 9101083
        },
        "id": "9101083",
        "name": "My Meat Wagon",
          "address": "Market Square, Smithfield, Dublin Dublin 7",
          "locality": "Smithfield",
          "city": "Dublin",
          "city_id": 91,
          "latitude": "53.3489980000",
          "longitude": "-6.2788120000",
          "zipcode": "Dublin 7",
        "events_url": "https://www.zomato.com/dublin/my-meat-wagon-smithfield/events#tabtop?utm_source=api_basic_user&utm_medium=api&utm_campaign=v2.1",
        "establishment_types": []
      }
    },
    {
      "restaurant": {
        "R": {
          "res_id": 9101628
        },
        "id": "9101628",
        "name": "Wowburger",
        "url": "https://www.zomato.com/dublin/wowburger-temple-bar?utm_source=api_basic_user&utm_medium=api&utm_campaign=v2.1",
        "location": {
          "address": "The Workmans Club, 11 Wellington Quay, Temple Bar, Dublin Dublin 2",
          "locality": "The Workmans Club",
          "city": "Dublin",
          "city_id": 91,
          "latitude": "53.3452863158",
          "longitude": "-6.2663815543",
          "zipcode": "Dublin 2",
          "country_id": 97,
          "locality_verbose": "The Workmans Club, Dublin"
        },
        "switch_to_order_menu": 0,
        "cuisines": "Burger",
        "average_cost_for_two": 20,
        "establishment_types": []
      }
    },
    {
      "restaurant": {
        "R": {
          "res_id": 16520426
        },
        "id": "16520426",
        "name": "Brother Hubbard",
          "locality_verbose": "North City, Dublin"
        },

目前它会显示第一个餐厅名称三次。我希望它可以循环遍历每个restaurant对象,并显示键“name”的值。任何帮助都将不胜感激。

2个回答

87

如果您的列表中包含restaurants,则需要对这个键进行迭代:

for restaurant in data['restaurants']:
    print restaurant['restaurant']['name']

我正在使用ajax将数据作为数组发送到Django视图,以变量legData的形式包含两个值[1406, 1409]。如果我使用print(legData)打印到控制台,我会得到输出为**[1406,1409]。但是,如果我尝试解析列表的单个值,例如for idx, xLeg in enumerate(legData): print(idx, xLeg),我会得到单个整数的输出,例如[, 1, 4, 0, 6 **等,对应于索引0、1、2、3、4等(是的,方括号和逗号也被输出,就好像它们是数据本身的一部分)。这里出了什么问题? - Love Putin Not War

16
with open('data.json') as data_file:    
data = json.load(data_file)
for restaurant in data['restaurant']:
    print restaurant['restaurant']['name']

通过这种方式,您将循环遍历“餐厅”字段中的字典列表中的元素并输出它们的名称。

你真的很接近了,之前你所做的是循环遍历JSON文件中所有主要字段,并在每次迭代时打印第一个餐厅的名称(data['restaurants'][0]给出餐厅列表中的第一个餐厅...并且您每次都打印了它的名称)


小修正 - 应该是 for restaurant in data['restaurants']: - hare krshn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接