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.loads
– JSONDecodeError: 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