使用 Python 请求和错误代码解析 JSON 数组

Posted

技术标签:

【中文标题】使用 Python 请求和错误代码解析 JSON 数组【英文标题】:Parsing JSON Array using Python Requests & Error Codes 【发布时间】:2015-11-22 09:46:08 【问题描述】:

我正在尝试解析 JSON 数组,但是遇到了一些问题。 这是我当前的代码:

from django.http import HttpResponse
import json, requests
platformUrl = 'https://www.igbd.com/api/v1/platforms'
platformReq = requests.get(platformUrl, headers='Authorization': 'Token token="1234"')
platformData = json.loads(platformReq)#json.loads(platformReq.text)
platformList = data['platforms']

print platformList

示例输出为:

"platforms":["id":32,"name":"世嘉土星","slug":"saturn","id":14,"name":"Mac"," slug":"mac","id":47,"name":"虚拟控制台(任天堂)","slug":"vc"

我收到错误:

预期的字符串或缓冲区

当我使用此代码时,它可以工作,但输出错误,并且不适用于数组:

from django.http import HttpResponse
import json, requests

platformUrl = 'https://www.igdb.com/api/v1/platforms'
platformReq = requests.get(platformUrl, headers='Authorization': 'Token token=1234"')
platformData = platformReq.json()

print platformData

这是带有该代码的输出:

u'platforms': [u'slug': u'saturn', u'id': 32, u'name': u'Sega Saturn', u'slug': u'mac' , u'id': 14, u'name': u'Mac', u'slug': u'vc', u'id': 47, u'name': u'Virtual Console (Nintendo)'

额外问题:我将如何处理请求的错误? 例如:200 - 一切正常,401 - 密钥无效,等等……

任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

这是因为你在json.loads中传递了一个request对象

在错误中它说它需要一个字符串或缓冲区。您可以通过以下方式从请求中传递字符串:

json.loads(platformReq.text)

platformReq.json() 的工作方式相同!

希望对您有所帮助。

编辑

回复您的状态码问题(抱歉之前没有看到)。您可以像这样检查响应状态代码:

if platformReq.status_code == requests.codes.ok:
    # Print the response
    print platformReq.json()
else:
    print "Something went wrong";

【讨论】:

打印时它的格式仍然很奇怪,它在所有内容之前都有字母 u。请参阅第一篇文章。 @AllTheGoodNamesWereTaken 那是因为它是 unicode。这不是一件坏事,计算机可以完美读取。顺便说一句,我编辑了我的帖子,我没有看到你的状态码问题。 如果它给了我一个特定的状态码,例如:500。我能具体说明问题是什么吗? @AllTheGoodNamesWereTaken 这意味着它有一个内部服务器错误,这是在他们这边。这里是关于状态码的更多信息w3.org/Protocols/rfc2616/rfc2616-sec10.html【参考方案2】:

如果您期待 JSON 响应,您注释掉的代码应该可以工作:

    json.loads(platformReq.text)

你得到的错误是因为 json.loads() 需要一个字符串,而不是一个响应对象。

至于错误处理,我建议在此顶部为 platformReg.status_code 添加一个检查,以确保在继续之前它等于 200

【讨论】:

如果我需要将错误推送到网页上怎么办?例如,如果它给出 500 错误,我将如何显示? @AllTheGoodNamesWereTaken 假设此代码在视图中,您可以执行以下操作:---- if platformReq.status_code == 500: ------------------ ----------------------------------------------------------- return HttpResponse('500_error.html') -------------------------------------------------- ------------ 您将不得不创建该 html 页面,但您可以这样做来显示它。如果这应该返回 JSON,请将 html 页面替换为 JSON 对象,其中包含您在前端检查的错误消息。

以上是关于使用 Python 请求和错误代码解析 JSON 数组的主要内容,如果未能解决你的问题,请参考以下文章

尝试在 python 中解析时出现 JSON 键错误

json解析失败怎么解决?

Python 中的 HTTP 请求和 JSON 解析

使用 Shell / Python 解析格式错误的 JSON

Python 请求 - 快速知道响应是不是是 json 可解析的

使用 JSON 和 Python 的 API GET 请求时收到错误