Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 流式传输时,我不断收到JSONDecodeError_Python_Json_Python 3.x_Python Requests - Fatal编程技术网

Python 流式传输时,我不断收到JSONDecodeError

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

我正在使用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
,我该如何解决这个问题

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对象不是在一行上,而是从服务器上预格式化的。谢谢!我会测试这些,希望我能多投票一次!谢谢!我会测试这些,希望我能多投票一次!