json.loads在JSON有效时抛出错误

lqfhib0f  于 2023-06-25  发布在  其他
关注(0)|答案(1)|浏览(135)

我有json数据,你可以从here下载(它太长了,无法粘贴在这里)。此数据从文件中读取并使用json.loads(str)加载。例如:

path = open(file_path_presented).read())
try:
    retval = json.load(open(path))
except Exception as e:
    if "File name too long" in str(e):
        retval = json.loads(path)
        # erroring out here with the json in the link

每次加载这个json时,我都会收到以下错误:

EXCEPTION INFORMATION: Traceback (most recent call):
  File "/mnt/c/Users/rando/bin/python/mt/api/api_handler.py", line 932, in get
    retval = json.loads(str(path))
  File "/usr/lib/python2.7/json/__init__.py", line 339, in loads
    return _default_decoder.decode(s)
  File "/usr/lib/python2.7/json/decoder.py", line 364, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/usr/lib/python2.7/json/decoder.py", line 380, in raw_decode
    obj, end = self.scan_once(s, idx)
Unterminated string starting at: line 1 column 25 (char 24)

我最好的猜测是,这个错误与json数据中含有{}字符有关,这些字符没有被正确转义,因为它只是偶尔发生,而不是一直发生。我使用了多个linter,它们都说JSON是有效的JSON,还有jq。如何加载这个json并抛出错误?
我尝试将数据以StringIO的形式加载到json.load(io)

from StringIO import StringIO

io = StringIO(path)
retval = json.load(io)

以及使用正则表达式修复JSON以及使用json.loads(path, strict=False)但是这些都产生了合理的错误

iugsix8n

iugsix8n1#

JSON数据似乎没有任何问题。
您可能没有使用将其转换为Python字典的最合适的技术。
考虑一下:

import requests
import json

TARGET = '/Volumes/G-Drive/foo.json'
with requests.get('https://pastebin.com/raw/X8f4Nz6v', stream=True) as r:
    r.raise_for_status()
    with open(TARGET, 'wb') as j:
        for chunk in r.iter_content(4096):
            j.write(chunk)
with open(TARGET) as j:
    d = json.load(j)

此代码运行至完成,没有任何异常

可选:

如果你不想创建一个本地文件,你可以构建一个bytearray,如下所示:

with requests.get('https://pastebin.com/raw/X8f4Nz6v', stream=True) as r:
    r.raise_for_status()
    b = bytearray()
    for chunk in r.iter_content(4096):
        b += chunk
    d = json.loads(b.decode())

相关问题