При попытке декодирования JSON появляется ошибка Expecting value: line 1 column 1 (char 0)
.
URL-адрес, который я использую для вызова API, отлично работает в браузере, но дает эту ошибку, когда выполняется запрос 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
Полный трассировка:
Traceback:
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. Если у вас нет особых требований для его использования, есть более эффективные варианты.
requests
предлагает самый дружественный API, включая поддержку JSON. Если вы можете, замените свой вызов на:
import requests
return requests.get(url).json()
requests
! Трассировка предполагает, что в requests
используется complexjson
, который использует simplejson
. Weird.
simplejson
если доступно; некоторые люди хотят использовать последнюю версию simplejson, а не ту, что входит в состав Python stdlib.
Проверьте тело данных ответа, имеются ли фактические данные, и дамп данных выглядит хорошо отформатированным.
В большинстве случаев ваша ошибка json.loads
- JSONDecodeError: Expecting value: line 1 column 1 (char 0)
обусловлена:
В конечном счете ошибка говорит вам, что в самой первой позиции строка уже не соответствует JSON.
Таким образом, если синтаксический анализ не выполняется, несмотря на то, что тело данных выглядит как JSON, как на первый взгляд, попробуйте заменить кавычки тела данных:
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.get(url).json()
просто работает, JSON тоже не деформирован.
С requests
это может произойти, если у вас есть код ошибки HTTP, например, 404 и попытайтесь разобрать ответ как JSON!
Вы должны сначала проверить OK или позволить ему поднять ошибку, чтобы избежать этого случая. Мне жаль, что это не получилось с менее загадочным сообщением об ошибке.
Там могут быть встроены 0, даже после вызова decode(). Используйте 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
simple
)json
может работать с JSON в кодировке UTF-8.pycurl
когдаpycurl
более простые библиотеки, такие какrequests
?