Python 流式传输时,我不断收到JSONDecodeError
我正在使用Python请求库对url进行流式处理,并不断出现以下错误:Python 流式传输时,我不断收到JSONDecodeError,python,json,python-3.x,python-requests,Python,Json,Python 3.x,Python Requests,我正在使用Python请求库对url进行流式处理,并不断出现以下错误: import json import requests s = requests.Session() payload = {'limit': 0} r = s.get('https://api.coinmarketcap.com/v1/ticker', params=payload, timeout=(connect_timeout, read_timeout), stream=True) r.raise_for_sta
import json
import requests
s = requests.Session()
payload = {'limit': 0}
r = s.get('https://api.coinmarketcap.com/v1/ticker', params=payload, timeout=(connect_timeout, read_timeout), stream=True)
r.raise_for_status()
for raw_rsvp in r.iter_lines(decode_unicode=True):
if raw_rsvp:
rsvp = json.loads(raw_rsvp)
print(rsvp)
我知道它试图在数组中的对象完成之前读取json
,我该如何解决这个问题
Expecting value: line 1 column 2 (char 1) Traceback (most recent call last):
File "benchmarks_generator.py", line 26, in refresh_coinmarketcap
rsvp = json.loads(raw_rsvp)
File "/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/__init__.py", line 354, in loads
return _default_decoder.decode(s)
File "/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/decoder.py", line 339, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/decoder.py", line 357, in raw_decode
raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 2 (char 1)
正如您所说,您收到的是
JSONDecodeError
,因为b'['
和其他字符串无效json
字符串。只要结果是一个json对象数组,您必须获得整个数组才能将其转换为python obj
因此,如果您必须使用流式请求(stream=True
),唯一的方法是将输出读取到字符串缓冲区(或其他类型的缓冲区以存储临时数据),并在传输完成后将其转换为JSON obj(此示例和其他示例在python3
中编写):
另一种解决方法是从流中捕获每个JSON对象并将其转换为python对象,然后将它们逐个放入列表中
import json
import requests
s = requests.Session()
payload = {'limit': 0}
r = s.get('https://api.coinmarketcap.com/v1/ticker', params=payload, stream=True)
r.raise_for_status()
buf = ''
rsvp = []
for raw_rsvp in r.iter_lines(decode_unicode=True):
line = raw_rsvp.decode().strip()
if line in ('[', ']'):
pass
elif line == '{':
buf += line
elif line in ('}', '},'):
buf += line
if buf.endswith(','):
buf = buf[:-1] # trim trailing comma
rsvp.append(json.loads(buf))
buf = '' # erase buffer
else:
buf += line
注意:非流式请求将更容易:
import requests
s = requests.Session()
payload = {'limit': 0}
r = s.get('https://api.coinmarketcap.com/v1/ticker', params=payload)
r.raise_for_status()
rsvp = r.json()
正如您所说,您收到的是JSONDecodeError
,因为b'['
和其他字符串无效json
字符串。只要结果是一个json对象数组,您必须获得整个数组才能将其转换为python obj
因此,如果您必须使用流式请求(stream=True
),唯一的方法是将输出读取到字符串缓冲区(或其他类型的缓冲区以存储临时数据),并在传输完成后将其转换为JSON obj(此示例和其他示例在python3
中编写):
另一种解决方法是从流中捕获每个JSON对象并将其转换为python对象,然后将它们逐个放入列表中
import json
import requests
s = requests.Session()
payload = {'limit': 0}
r = s.get('https://api.coinmarketcap.com/v1/ticker', params=payload, stream=True)
r.raise_for_status()
buf = ''
rsvp = []
for raw_rsvp in r.iter_lines(decode_unicode=True):
line = raw_rsvp.decode().strip()
if line in ('[', ']'):
pass
elif line == '{':
buf += line
elif line in ('}', '},'):
buf += line
if buf.endswith(','):
buf = buf[:-1] # trim trailing comma
rsvp.append(json.loads(buf))
buf = '' # erase buffer
else:
buf += line
注意:非流式请求将更容易:
import requests
s = requests.Session()
payload = {'limit': 0}
r = s.get('https://api.coinmarketcap.com/v1/ticker', params=payload)
r.raise_for_status()
rsvp = r.json()
为什么我会被否决,如果你不相信我,这个问题在[python requests]标记搜索下是合法的没有回答?raw_rsvp包含什么?@MrLeeh它有一个“[”字符,原来json对象不是在一行上,而是从服务器上预格式化的。为什么我会被否决,这个问题在[python requests]标记搜索下是合法的没有回答[python requests]标记搜索如果你不相信我raw_rsvp包含什么?@MrLeeh它有一个“[”字符,结果json对象不是在一行上,而是从服务器上预格式化的。谢谢!我会测试这些,希望我能多投票一次!谢谢!我会测试这些,希望我能多投票一次!