使用Python解析json文件,它具有多个具有相同值的对

时间:2013-10-02 11:37:57

标签: python json

我是python的新手,我有一个json响应(见下文)。我想搜索site1的id值,并列出id的所有值。

{ "listSiteResponse" : { "count":4 ,"site" : [  {
  "id": "28e4cc3f-d0c2-46f4-9e0c-b532fd148292",
  "simpleid": 15,
  "name": "Site1",
  "description": "Blr1",
  "location": "Bangalore1",
}, {
  "id": "188d4b47-1955-43e1-82a8-7ccedcfc636b",
  "simpleid": 16,
  "name": "Site2",
  "description": "Blr2",
  "location": "Bangalore2",
}, {
  "id": "63fab512-4b52-4038-8a3b-4632f1911dca",
  "simpleid": 17,
  "name": "Site3",
  "description": "Blr3",
  "location": "Bangalore3",
}, {
  "id": "2db3949a-ba2f-4e93-85b5-24a995fa3d99",
  "simpleid": 18,
  "name": "Site4",
  "description": "Blr4",
  "location": "Bangalore4",
} 
}}

我尝试使用以下脚本列出ID但我收到错误:

from pprint import pprint
json_data=open('logs/CurrentSitesList.txt')

data = json.load(json_data)
test=data["listSiteResponse"]["site"]["id"]

1 个答案:

答案 0 :(得分:2)

您正试图获取id site的{​​{1}},但问题是listSiteResponsedata["listSiteResponse"]["site"]而不是单个项目,你无法获得列表的list;相反,您可以在该列表中获取所有项目的id或仅一个项目:

id

其中,不使用紧凑列表理解语法,相当于:

ids = [x["id"] for x in data["listSiteResponse"]["site"]]

但是列表理解语法是,IMO,更具可读性(以及明显更短)。

此外,当您打开文件时,应确保它已关闭;所以你可以使用ids = [] for site in data["listSiteResponse"]["site"]: ids.append(site["id"]) 或者更好:

try-finally

P.S。您可能需要阅读PEP8:)

更新:根据OP在评论中的附加评论:

给出网站列表

with open('logs/CurrentSitesList.txt') as f:
    data = json.load(f)

您可能想要找到具有给定ID的网站

sites = data["listSiteResponse"]["site"]

或找到符合条件的网站ID(概括上一个代码段)

site = [x for x in sites if x["id"] == <SPECIFIC_ID>].pop(0, None)
# site will contain either the found object, or None

但在第二种情况下,根据标准,您可能会获得多个结果,因此如果是这种情况,请相应调整您的代码。

有关更全面的Python教程,请参阅免费提供的图书 Learn Python the Hard Way