流式传输时,我一直收到JSONDecodeError

2024-06-25 22:49:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用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_status()

for raw_rsvp in r.iter_lines(decode_unicode=True):
    if raw_rsvp:
        rsvp = json.loads(raw_rsvp)
        print(rsvp)

我知道它试图在数组中的对象完成之前读取json,我该如何解决这个问题?在

^{pr2}$

Tags: importjsontrueurlforgetrawsession
1条回答
网友
1楼 · 发布于 2024-06-25 22:49:52

正如您所说,您收到的是JSONDecodeError,因为b'['和其他字符串不是有效的json字符串。只要结果是一个JSON对象数组,就必须获取整个数组,才能将其转换为python对象。在

因此,如果您必须使用流式请求(stream=True),唯一的方法是将输出读取到字符串缓冲区(或其他类型的缓冲区以存储临时数据),并在传输完成后将其转换为JSON obj(此示例和其他示例用python3编写):

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 = ''
for raw_rsvp in r.iter_lines(decode_unicode=True):
    buf += raw_rsvp.decode()  # bytes -> str for python3 compatibility

rsvp = json.loads(buf)

另一种解决方法是从流中捕获每个JSON obj并将其转换为python obj,然后将它们逐个放入list。但这有点奇怪而且很慢:

^{pr2}$

注:非流式请求将更容易:

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()

相关问题 更多 >