Python ValueError: No JSON Object Could Be Decoded (Intermittent)

Python ValueError: No JSON Object Could Be Decoded (Intermittent)

以下代码出错。但是,有时它会起作用,有时却不起作用。我已经使用 JSONLint 验证了数据。我尝试 decode/encode 基于对类似错误问题的响应的数据,并且还尝试使用编解码器模块进行相同的操作。我不明白的是为什么它有时工作正常而其他时候会抛出错误。

import requests
import json
import codecs

response = requests.get("https://api.weather.gov/alerts/active")
print(response.status_code)

with open ('data.json', 'w') as file:
    file.write(response.content)

myFile = open('data.json', 'r')
myObject = myFile.read()
u = myObject.decode('utf-8-sig')
myObject = u.encode('utf-8')
myFile.encoding
myFile.close()
myData = json.loads(myObject, 'utf-8') 

#myData=json.loads(codecs.open(myObject,'r', 'utf-8'))

可以在我问的另一个问题 中找到 JSON 数据的样本。

你为什么要把代码写得这么复杂?你可以这样做:

obj = requests.get("https://api.weather.gov/alerts/active").json()

json 对象自动为您解码为 pythonic dict。它似乎与 python 2.7.143.6.5 一致。

问题是你的JSON实际上是无效的。

, you can paste it into a JSON validator like this one and see the problem: On line 35, there's a trailing comma after the last value in an array. That's not legal JSON为例。所以没有符合规范的 JSON 解析器会解析它。

这与字符编码无关。因此,投入一堆额外的 encodedecode 调用并拉入额外的库来执行更多次不会有帮助。您已将字节正确解码为文本,但该文本无效 JSON.


为什么有时会发生而其他时候不会?据推测(仅基于端点的名称)API 正在从其后端的不同位置收集警报,有时其中一个警报的编码不正确,但大多数时候它们都很好(或者有没有)。谁知道?那不是你要修复的错误;这是他们的。

事实上,您应该做的第一件事是向提供者提交错误,向他们展示您遇到的问题 JSON,并准确指出问题所在。 (如果您与他们签订了某种支持合同,您可能想请他们为此做些事情,这样您就不必解决他们的问题,但我认为您不需要。)


在此期间你可以做什么?好吧,如果您可以 try/except JSONDecodeError: 并跳过偶尔出现的错误值,那么在他们解决问题之前,这可能是最好的答案。但是,如果数据不完整会使整个程序无效,那就不好了。特别是,在这种情况下,这可能意味着您在某个重要警报出现的整个时间内都没有获得任何数据,因此您永远不会看到它。

有 "sloppy JSON" 种解码器可供您试用。这通常是一个坏主意,因为很容易以错误的方式默默地解码某些内容,并将垃圾数据收集到您的集合中。这也意味着一旦作者认为这是个坏主意,大多数此类项目就会被放弃。但是人们一直在写新的,所以如果你真的想要,你可以搜索并找到一个。

如果他们JSON中的错误是一致的,并且你能想出如何描述它们,你应该可以写一个特殊用途的"sloppy JSON" 准确处理这些错误的解码器,或在解码前修复这些错误的预处理器。这将是非常重要的,可能有点丑陋,但也许 应该 丑陋——每次你阅读它时,它都会提醒你检查提供者是否修复了他们的错误所以你可以扔掉那些丑陋的代码。无论如何,没有人能够确定他们的错误是否一致,然后编写处理它们的代码,而不仅仅是一个例子。并且可能没有人愿意为您经历一大堆无效的 JSON。所以如果你想走这条路,你将不得不自己尝试这样做(当然,如果你遇到困难,你总是可以提出一个新问题,并在其中提供所有相关细节)。