我试图将GraphQL查询的输出迭代为JSON,并创建一个包含信息的Python字典列表(“ projects”变量)。这是到目前为止我一直在使用的代码:
url = 'https://api.github.com/graphql'
api_token = 'API_TOKEN'
headers = {'Authorization': 'token %s' % api_token}
# Parse Output
r = requests.post(url=url, json={'query': query}, headers=headers)
json_data = json.loads(r.text)
df_data = json_data['data']['user']['pinnedItems']['edges']
data = df_data
i = 0
while i < len(df_data):
for key, value in df_data[i].items():
projects = [
{
'name': value['name'],
'url': value['url']
}
]
i += 1
但是,当我执行此代码并打印出projects
时,只会捕获第一个对象。有谁知道如何将多个对象添加到列表中?我总共有四个物体。
注意:JSON基于GitHub API的GraphQL输出,查询如下:
query {
user(login:"USER") {
pinnedItems(first: 4, types: [REPOSITORY]) {
edges {
node {
... on Repository {
name
shortDescriptionHTML
url
openGraphImageUrl
}
}
}
}
}
}
这是来自GitHub的完整JSON输出:
{
"data": {
"user": {
"pinnedItems": {
"edges": [
{
"node": {
"name": "TEXT",
"shortDescriptionHTML": "TEXT",
"url": "URL",
"openGraphImageUrl": "URL"
}
},
{
"node": {
"name": "TEXT",
"shortDescriptionHTML": "TEXT",
"url": "URL",
"openGraphImageUrl": "URL"
}
},
{
"node": {
"name": "TEXT",
"shortDescriptionHTML": "TEXT",
"url": "URL",
"openGraphImageUrl": "URL"
}
},
{
"node": {
"name": "TEXT",
"shortDescriptionHTML": "TEXT",
"url": "URL",
"openGraphImageUrl": "URL"
}
}
]
}
}
}
}
谢谢
答案 0 :(得分:2)
您基本上每次都要创建一个包含一项的新列表。 要将更多项目附加到同一列表中,您需要使用python_guy_rany向您显示的方法“ list.append()”。
但是,如果您想继续使用while循环,请不要忘记将i + = 1添加到python_guy_rany代码中。 我宁愿使用for循环:
for i in range(len(df_data)):
您可以避免同时使用i = 0和i + = 1。 您也可以使用列表理解,但是我认为坚持使用for循环更容易理解。
答案 1 :(得分:1)
更改此:
while i < len(df_data):
for key, value in df_data[i].items():
projects = [
{
'name': value['name'],
'url': value['url']
}
]
对此:
data = []
while i < len(df_data):
for key, value in df_data[i].items():
tmp_data = {'name': value['name'], 'url': value['ur']}
data.append(tmp_data)
答案 2 :(得分:1)
仅捕获第一个对象
您没有捕获第一个数据。节点后,该列表正在被覆盖。因此,您实际上看到的是最后一个节点的信息。优良作法是使用不同的名称命名示例数据,例如对它们进行编号,以便更轻松地排除故障。
data = df_data
的用途是什么,它正在初始化但未使用。
df_data = json_data['data']['user']['pinnedItems']['edges']
data_length = len(df_data)
i = 0
projects = []
while i < data_length:
for key, value in df_data[i].items():
node_data = [{'name': value['name'], 'url': value['url']}]
projects.append(node_data)
i += 1
输出:
[[{'name': 'TEXT1', 'url': 'URL'}], [{'name': 'TEXT2', 'url': 'URL'}], [{'name': 'TEXT3', 'url': 'URL'}], [{'name': 'TEXT4', 'url': 'URL'}]]
答案 3 :(得分:1)
json_data['data']['user']['pinnedItems']['edges']
是一个字典列表,因此使用列表推导很容易解析它。
url = 'https://api.github.com/graphql'
api_token = 'API_TOKEN'
headers = {'Authorization': 'token %s' % api_token}
# Parse Output
r = requests.post(url=url, json={'query': query}, headers=headers)
json_data = json.loads(r.text)
df_data = json_data['data']['user']['pinnedItems']['edges']
data = [{'name':x['node']['name'], 'url':x['node']['url']} for x in df_data]