Вопрос-Ответ

JSONDecodeError: Expecting value: line 1 column 1 (char 0)

JSONDecodeError: Ожидаемое значение: строка 1, столбец 1 (символ 0)

Я получаю ошибку Expecting value: line 1 column 1 (char 0) при попытке декодировать JSON.

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

Обратная трассировка:

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)
Переведено автоматически
Ответ 1

Ваш код выдал пустое тело ответа; вы хотели бы проверить это или перехватить возникшее исключение. Возможно, сервер ответил ответом 204 "Нет содержимого" или был возвращен код состояния, отличный от диапазона 200 (404 "Не найдено" и т.д.). Проверьте это.

Примечание:


  • Нет необходимости использовать simplejson библиотеку, та же библиотека включена в Python, что и json модуль. (В этом примечании вопрос был сформулирован изначально).



  • Нет необходимости декодировать ответ из UTF8 в Unicode, метод simplejson / json .loads() может обрабатывать данные в кодировке UTF8 изначально.



  • pycurl имеет очень архаичный API. Если у вас нет особых требований к его использованию, есть варианты получше.



Либо 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()

Конечно, это не защитит вас от URL-адреса, который не соответствует стандартам HTTP; при использовании произвольных URL-адресов, где это возможно, проверьте, намеревался ли сервер предоставить вам JSON, проверив заголовок Content-Type , и для надежности перехватите исключение:

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
Ответ 2

Не забудьте вызвать json.loads() для содержимого файла, а не для пути к файлу этого JSON:

json_file_path = "/path/to/example.json"

with open(json_file_path, 'r') as j:
contents = json.loads(j.read())

Я думаю, что многие люди виновны в том, что время от времени делают это (включая меня):

contents = json.load(json_file_path)
Ответ 3

Проверьте тело данных ответа, присутствуют ли фактические данные, и дамп данных выглядит правильно отформатированным.

В большинстве случаев ваша json.loads- JSONDecodeError: Expecting value: line 1 column 1 (char 0) ошибка вызвана :


  • кавычки, не соответствующие JSON

  • Вывод XML / HTML (то есть строка, начинающаяся с <), или

  • несовместимая кодировка символов

В конечном итоге ошибка сообщает вам, что в самой первой позиции строка уже не соответствует 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()

Примечание: Кавычки внутри данных должны быть правильно экранированы

Ответ 4

С requests библиотекой JSONDecodeError может произойти ошибка, когда у вас есть код ошибки http, подобный 404, и вы пытаетесь проанализировать ответ как JSON!

Вы должны сначала проверить значение 200 (OK) или разрешить ему повышаться при ошибке, чтобы избежать этого случая. Я бы хотел, чтобы это завершилось неудачей с менее загадочным сообщением об ошибке.

ПРИМЕЧАНИЕ: как заявил Мартийн Питерс в комментариях, серверы могут отвечать JSON в случае ошибок (это зависит от реализации), поэтому проверка Content-Type заголовка более надежна.

python json