JSONDecodeError: Ожидающее значение: строка 1 столбец 1 (char 0)

При попытке декодирования 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)

Ответ 1

Подводя итог разговору в комментариях:

  • Нет необходимости использовать библиотеку simplejson, одна и та же библиотека включена с Python в качестве модуля json.

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

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

requests предлагает самый дружественный API, включая поддержку JSON. Если вы можете, замените свой вызов на:

import requests

return requests.get(url).json()

Ответ 2

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

В большинстве случаев ваша ошибка 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()

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

Ответ 3

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

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

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

Ответ 4

Там могут быть встроены 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

Ответ 5

У меня была именно эта проблема с использованием запросов. Спасибо Кристофу Русси за его объяснение.

Для отладки я использовал:

response = requests.get(url)
logger.info(type(response))

Я получал ответ 404 от API.

Ответ 6

У меня была такая же проблема с запросами (библиотека python). Это был заголовок accept-encoding.

Это было установлено так: 'accept-encoding': 'gzip, deflate, br'

Я просто удалил его из запроса и перестал получать ошибку.

Ответ 7

проверьте формат кодировки вашего файла и используйте соответствующий формат кодирования при чтении файла. Это решит вашу проблему.

with open("AB.json",encoding='utf-16', errors='ignore') as json_data:
     data = json.load(json_data, strict=False)

Ответ 8

Часто это происходит потому, что строка, которую вы пытаетесь проанализировать, пуста:

>>> import json
>>> x = json.loads("")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/Cellar/python/3.7.3/Frameworks/Python.framework/Versions/3.7/lib/python3.7/json/__init__.py", line 348, in loads
    return _default_decoder.decode(s)
  File "/usr/local/Cellar/python/3.7.3/Frameworks/Python.framework/Versions/3.7/lib/python3.7/json/decoder.py", line 337, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/usr/local/Cellar/python/3.7.3/Frameworks/Python.framework/Versions/3.7/lib/python3.7/json/decoder.py", line 355, in raw_decode
    raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

Вы можете исправить len(json_string) предварительно проверив len(json_string):

import json

if len(json_string) > 0:
    x = json.loads(json_string)
else:
    // Your logic here
    x = {}