【问题标题】:Python not decoding jsonPython不解码json
【发布时间】:2014-01-19 03:51:39
【问题描述】:

我收到错误消息:

No JSON object could be decoded: line 1 column 0 (char 0)

尝试解析从 xbox 音乐 api 返回的 json 对象时。

这是我的代码:

conn = httplib.HTTPSConnection(SERVICE_API)
conn.request("GET", url)
response = conn.getresponse()
data = response.read()
j = json.loads(data)

最后一行是返回上述错误的内容。如果我将其注释掉并打印出“数据”,我可以看到 json 对象。如果我将其复制/过去到 jsonlint.com 以查看它是否有效,它会说它是有效的。我会在这里发布,但它是 800 行。

【问题讨论】:

  • 我们需要看到的不仅仅是这段代码。 data 这里到底包含什么?你打电话的网址是什么?你能给我们print urlprint repr(data[:100])吗?
  • 另外,您用jsonp 标记了它,这是一个非常具体的协议,Python json 模块不支持(它不需要)。你为什么这样做?
  • 在读取响应和解码数据之间没有代码 - 所以如果你真的尝试打印它(而不是 json 加载它)并在它上面运行 jsonlint,那么神奇的小精灵一定在工作。告诉我们整个故事
  • 当我注释掉最后一行,以'j'开头并在其上方放置一个'打印数据'时,我屏幕上显示的代码是这样的:pastebin.com/WAwW6T6H ...我放入的 json 验证器中的代码返回干净。
  • 这里是 print repr(data[:100]) '\xef\xbb\xbf{"Albums":{"Items":[{"ReleaseDate":"2013-09- 17T00:00:00Z","持续时间":"00:45:22","TrackCount":16,"'

标签: python json jsonp


【解决方案1】:

您正在访问一开始就包含 UTF-8 BOM 的 Microsoft 服务。但微软更喜欢 UTF-8 中的 BOM(这里完全是多余的),因为它将 BOM 引入 UTF-8,以便记事本和其他 Windows 应用程序更容易自动检测所使用的编码。

愚蠢的微软,根据 JSON RFC,这非常无效;如果在任何地方有联系地址,您应该将此作为错误报告给他们。

您可以使用以下方法剥离 BOM:

import codecs

data = response.read()
if data.startswith(codecs.BOM_UTF8):
    data = data[3:]

【讨论】:

  • 有趣。我会调查的。
猜你喜欢
  • 2011-07-21
  • 2016-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-07
  • 2019-12-18
  • 2010-10-16
  • 1970-01-01
相关资源
最近更新 更多