我在try 解码JSON时遇到错误Expecting value: line 1 column 1 (char 0).

我用于API调用的URL在浏览器中运行良好,但在通过cURL请求执行时会出现此错误.以下是我用于cURL请求的代码.

错误发生在return simplejson.loads(response_json)

response_json = self.web_fetch(url)
response_json = response_json.decode('utf-8')
return json.loads(response_json)


def web_fetch(self, url):
    buffer = StringIO()
    curl = pycurl.Curl()
    curl.setopt(curl.URL, url)
    curl.setopt(curl.TIMEOUT, self.timeout)
    curl.setopt(curl.WRITEFUNCTION, buffer.write)
    curl.perform()
    curl.close()
    response = buffer.getvalue().strip()
    return response

回溯:

File "/Users/nab/Desktop/myenv2/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response
  111.                         response = callback(request, *callback_args, **callback_kwargs)
File "/Users/nab/Desktop/pricestore/pricemodels/views.py" in view_category
  620.     apicall=api.API().search_parts(category_id= str(categoryofpart.api_id), manufacturer = manufacturer, filter = filters, start=(catpage-1)*20, limit=20, sort_by='[["mpn","asc"]]')
File "/Users/nab/Desktop/pricestore/pricemodels/api.py" in search_parts
  176.         return simplejson.loads(response_json)
File "/Users/nab/Desktop/myenv2/lib/python2.7/site-packages/simplejson/__init__.py" in loads
  455.         return _default_decoder.decode(s)
File "/Users/nab/Desktop/myenv2/lib/python2.7/site-packages/simplejson/decoder.py" in decode
  374.         obj, end = self.raw_decode(s)
File "/Users/nab/Desktop/myenv2/lib/python2.7/site-packages/simplejson/decoder.py" in raw_decode
  393.         return self.scan_once(s, idx=_w(s, idx).end())

Exception Type: JSONDecodeError at /pricemodels/2/dir/
Exception Value: Expecting value: line 1 column 1 (char 0)

推荐答案

您的代码生成了一个空的响应体,您可能希望判断它或捕获引发的异常.可能是服务器响应了204无内容响应,或者返回了非200范围的状态代码(404未找到,等等).看看这个.

注:

  • 不需要使用simplejson库,Python附带了与json模块相同的库.

  • 不需要将UTF8的响应解码为unicode,simplejson/json .loads()方法可以本地处理UTF8编码的数据.

  • pycurl有一个非常古老的API.除非你对使用它有特定的要求,否则还有更好的 Select .

无论是requests还是httpx都提供了更友好的API,包括JSON支持.如果可以,请将您的呼叫替换为:

import requests

response = requests.get(url)
response.raise_for_status()  # raises exception when not a 2xx response
if response.status_code != 204:
    return response.json()

当然,这不会保护您免受不符合HTTP标准的URL的攻击;如果可能使用任意URL,请判断服务器是否打算通过判断内容类型头为您提供JSON,并在一定程度上捕获异常:

if (
    response.status_code != 204 and
    response.headers["content-type"].strip().startswith("application/json")
):
    try:
        return response.json()
    except ValueError:
        # decide how to handle a server that's misbehaving to this extent

Python相关问答推荐

如何在BeautifulSoup中链接Find()方法并处理无?

Python在tuple上操作不会通过整个单词匹配

Pandas 在最近的日期合并,考虑到破产

按列分区,按另一列排序

管道冻结和管道卸载

' osmnx.shortest_track '返回有效源 node 和目标 node 的'无'

为什么sys.exit()不能与subproccess.run()或subprocess.call()一起使用

如何从在虚拟Python环境中运行的脚本中运行需要宿主Python环境的Shell脚本?

如何将Docker内部运行的mariadb与主机上Docker外部运行的Python脚本连接起来

Telethon加入私有频道

如何调整QscrollArea以正确显示内部正在变化的Qgridlayout?

在vscode上使用Python虚拟环境时((env))

Pandas计数符合某些条件的特定列的数量

在Python中调用变量(特别是Tkinter)

手动设置seborn/matplotlib散点图连续变量图例中显示的值

Python日志(log)库如何有效地获取lineno和funcName?

Polars表达式无法访问中间列创建表达式

如何提高Pandas DataFrame中随机列 Select 和分配的效率?

Pythonquests.get(Url)返回Colab中的空内容

我怎样才能让深度测试在OpenGL中使用Python和PyGame呢?