it-swarm.com.ru

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)
133
user1328021

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

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

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

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

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

import requests

return requests.get(url).json()
79
Martijn Pieters

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

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

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

41
Lorenz Lo Sauer

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

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

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

19
Christophe Roussy

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

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

>>> 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)

Вы можете исправить это, проверив, пусто ли json_string:

import json

if json_string:
    x = json.loads(json_string)
else:
    // Your logic here
    x = {}
1
Alex W

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

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

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

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

0
Kelsie Braidwood

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

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

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

Это было установлено следующим образом: 'accept-encoding': 'gzip, deflate, br'

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

0
Seu Madruga