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

57

При попытке декодирования 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)
  • 0
    Зачем декодировать ответ? ( simple ) json может работать с JSON в кодировке UTF-8.
  • 3
    Кроме того, зачем использовать pycurl когда pycurl более простые библиотеки, такие как requests ?
Показать ещё 13 комментариев
Теги:
curl

4 ответа

43
Лучший ответ

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

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

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

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

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

import requests

return requests.get(url).json()
  • 42
    Я получаю эту же ошибку, используя requests ! Трассировка предполагает, что в requests используется complexjson , который использует simplejson . Weird.
  • 0
    @Rayu: запросы будут использовать simplejson если доступно; некоторые люди хотят использовать последнюю версию simplejson, а не ту, что входит в состав Python stdlib.
Показать ещё 4 комментария
27

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

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

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

  • 2
    В комментариях было ясно, что ОП получил пустой ответ. Так как requests.get(url).json() просто работает, JSON тоже не деформирован.
5

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

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

  • 0
    Извините за старый комментарий, но не могли бы вы дать ссылку на пример? Я пытаюсь перенять свои навыки от «выполнить действие» до «попытаться выполнить действие, дать ответ, отреагировать соответственно».
  • 0
    @dcclassics: Пример: происходит сбой на стороне сервера, и сервер отвечает, показывая страницу с ошибкой (HTML) вместо ответа с JSON, поэтому при синтаксическом анализе ответа будет пытаться прочитать JSON, но произойдет сбой в тегах HTML.
Показать ещё 1 комментарий
0

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню