英文:
json.loads throwing error when the JSON is valid
问题
我有可以从这里下载的JSON数据(太长无法在这里粘贴)。此数据从文件中读取并使用 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)
# 在这里出现了链接中的JSON错误
每次加载此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数据中的 {
和 }
字符没有正确转义有关,因为它仅在某些情况下发生,而不是每次都发生。我已经使用多个代码检查工具和 jq
,它们都表示JSON是有效的JSON。如何在不引发错误的情况下加载此JSON数据?
我尝试将数据加载为 StringIO
到 json.load(io)
中:
from StringIO import StringIO
io = StringIO(path)
retval = json.load(io)
以及使用正则表达式修复JSON,以及使用 json.loads(path, strict=False)
,但这些方法都产生了相同的错误。
英文:
I have json data that you can download from here (its too long to paste here). This data is being read from a file and loaded using json.loads(str)
. For example:
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
Every time I load this json I receive the following error:
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)
My best guess is that this error has something to do with the json data having {
and }
characters in it that are not being escaped properly because it only happens sometimes and not all the time. I've used multiple linters and all of them say that the JSON is valid JSON, along with jq
. How can I load this json with throwing an error?
I've tried loading the data as a StringIO
into json.load(io)
with:
from StringIO import StringIO
io = StringIO(path)
retval = json.load(io)
As well as fixing the JSON using a regex, and using json.loads(path, strict=False)
However these all produce the sane error
答案1
得分: 1
以下是翻译好的内容:
"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())
希望这对您有所帮助。
英文:
There doesn't appear to be anything wrong with the JSON data.
You may not be using the most appropriate technique for converting it to a Python dictionary.
Consider this:
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)
This code runs to completion without any exception(s)
Optionally:
If you don't want to create a local file you can just build a bytearray as follows:
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())
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论