JSONDecodeError:期望值:第1行第1列(char 0)

我得到错误Expecting value: line 1 column 1 (char 0)试图解码JSON时。

我用于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) 

在评论中总结对话:

  • 没有必要使用simplejson库,Python中包含了与json模块相同的库。

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

  • pycurl有一个非常古老的API。 除非你有使用它的具体要求,否则有更好的select。

requests提供了最友好的API,包括JSON支持。 如果可以,请将您的电话replace为:

 import requests return requests.get(url).json() 

检查响应数据主体是否存在实际数据,并且数据转储显示为格式良好。

在大多数情况下,您的json.loadsJSONDecodeError: Expecting value: line 1 column 1 (char 0)错误是由于:

  • 非JSON符合的引用
  • XML / HTML输出(即以<开头的string)或
  • 不兼容的字符编码

最终,错误告诉你,在第一个位置,string已经不符合JSON。

因此,如果parsing失败,尽pipe有乍一看像JSON的数据体,请尝试replace数据体的引号:

 import sys, json struct = {} try: try: #try parsing to dict dataform = str(response_json).strip("'<>() ").replace('\'', '\"') struct = json.loads(dataform) except: print repr(resonse_json) print sys.exc_info() 

注意:数据中的引号必须正确转义

有了这样的requests当你有一个像http 404错误代码,并尝试parsing响应为JSON!

您必须先检查确定,或者让错误发生,以避免这种情况。 我希望它失败了一个不太神秘的错误消息。

甚至在调用decode()之后,可能会embedded0。 使用replace():

 import json struct = {} try: response_json = response_json.decode('utf-8').replace('\0', '') struct = json.loads(response_json) except: print('bad json: ', response_json) return struct