0

我是 python 新手,我有一个 json 响应(见下文)。我想搜索 id 的值site1并列出 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"]
4

1 回答 1

2

您正在尝试获取idof sitethe listSiteResponse,但问题是它data["listSiteResponse"]["site"]不是list一个单独的项目,并且您无法获取id列表的 the ;相反,您可以id在该列表中获取所有项目或仅一项:

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

在不使用紧凑列表理解语法的情况下,它等价于:

ids = []
for site in data["listSiteResponse"]["site"]:
    ids.append(site["id"])

但是 IMO 的列表理解语法更具可读性(并且显然更短)。

另外,当你打开一个文件时,你应该确保它被关闭;所以你可以使用try-finally或更好:

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

PS你可能想阅读PEP8 :)

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

给定站点列表

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

或查找与标准匹配的网站的 ID(概括前面​​的代码段)

site = [x for x in sites if x["name"] == "Site 1"].pop(0, None)
site_id = site["id"] if site else None
# site_id will contain the ID of the matching site, None otherwise

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

如需更详尽的 Python 教程,请参阅免费提供的《Learn Python the Hard Way》一书。

于 2013-10-02T11:43:58.110 回答