Python json解码和解析数据

Python json解码和解析数据,python,json,Python,Json,我已经设法从一个API获取json数据,并提取我需要的部分。我只想将公共url部分解析为输出。这是我的代码: import json import httplib as client headers = {"Content-type": "application/json"} params = json.dumps({"auth": {"passwordCredentials": {"username": "myusername", "password": "mypassword

我已经设法从一个API获取json数据,并提取我需要的部分。我只想将公共url部分解析为输出。这是我的代码:

import json
import httplib as client
headers = {"Content-type": "application/json"}
params = json.dumps({"auth": {"passwordCredentials": {"username": "myusername",         "password": "mypassword"}}})
conn = client.HTTPSConnection("lon.identity.api.rackspacecloud.com:443")
conn.request("POST", "/v2.0/tokens", params, headers)
response = conn.getresponse()
output = response.read()
data = json.loads(output)
token = data['access']['serviceCatalog']
print(token)
这是输出数据:

[{"endpoints": [{"region": "LON","publicURL": "https://storage101.lon3.clouddrive.com/v1/MossoCloudFS_bfe4a309-40cf-49b8-acd0-d15f4865542f3","internalURL": "https://snet-storage101.lon3.clouddrive.com/v1/MossoCloudFS_bfe4a309-40cf-49b8-acd0-d15f48vdwds3","tenantId": "MossoCloudFS_bfe4a309-40cf-49b8-acd0-d15f486e82f3"}],"type": "object-store","name": "cloudFiles"}]
现在,在我的代码中,我尝试了:

token = data['access']['serviceCatalog']['endpoints']['publicURL']
但是我得到:TypeError:列表索引必须是整数,而不是str

如何解析publicURL

非常感谢

数据是一个列表(其中一个元素恰好是一个字典),但您正试图将其用作字典

>>> type(data)
<class 'list'>
>类型(数据)
试一试

data=data[0]
>>>类型(数据)

数据['access']['serviceCatalog']
不直接包含dict,而是包含唯一元素为dict的列表。类似地,
端点的dict值是唯一成员为dict的列表。请尝试以下操作:

token = data['access']['serviceCatalog'][0]['endpoints'][0]['publicURL']
回答下面评论中的问题,如果有多个端点,您可以使用a获取所有公共URL

urls = [x['endpoints'][0]['publicURL'] for x in data['access']['serviceCatalog']]

输出数据是一个数组,您需要通过索引访问该数据

在这种情况下:

token = data[0][xxx][xxx]
尽管使用了输出数据,但访问“publicURL”数据的正确语法是:

例如:

>>> data = [{"endpoints": [{"region": "LON","publicURL": "https://storage101.lon3.clouddrive.com/v1/MossoCloudFS_bfe4a309-40cf-49b8-acd0-d15f4865542f3","internalURL": "https://snet-storage101.lon3.clouddrive.com/v1/MossoCloudFS_bfe4a309-40cf-49b8-acd0-d15f48vdwds3","tenantId": "MossoCloudFS_bfe4a309-40cf-49b8-acd0-d15f486e82f3"}],"type": "object-store","name": "cloudFiles"}]
>>> data[0]["endpoints"][0]["publicURL"]
'https://storage101.lon3.clouddrive.com/v1/MossoCloudFS_bfe4a309-40cf-49b8-acd0-d15f4865542f3'

伟大的谢谢你的快速回复。如果你不介意的话,还有一个问题。输出提供了各种端点。为什么我只解析端点的所有publicURL?
data[0]["endpoints"][0]["publicURL"]
>>> data = [{"endpoints": [{"region": "LON","publicURL": "https://storage101.lon3.clouddrive.com/v1/MossoCloudFS_bfe4a309-40cf-49b8-acd0-d15f4865542f3","internalURL": "https://snet-storage101.lon3.clouddrive.com/v1/MossoCloudFS_bfe4a309-40cf-49b8-acd0-d15f48vdwds3","tenantId": "MossoCloudFS_bfe4a309-40cf-49b8-acd0-d15f486e82f3"}],"type": "object-store","name": "cloudFiles"}]
>>> data[0]["endpoints"][0]["publicURL"]
'https://storage101.lon3.clouddrive.com/v1/MossoCloudFS_bfe4a309-40cf-49b8-acd0-d15f4865542f3'