Я получаю сообщение об ошибке 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)
print repr(response_json)
говорит вам , что вас передают.loads()
?simplejson
когда вы можете просто использовать stdlibjson
(который является той же библиотекой, что иsimplejson
)?web_fetch()
звонок не удался.pycurl
.requests
предлагает гораздо более простой API, особенно когда дело доходит до отладки происходящего. Если вам не требуется более новая версияsimplejson
библиотеки, просто придерживайтесь ееjson
, сохраняя зависимость от управления.response_json
возвращаемое значение.json()
? Тогда у вас уже есть декодированные данные, и вам больше не нужно их использоватьjson.loads()
.response
расшифровал это для вас.Ответы:
Подводя итог разговора в комментариях:
Нет необходимости использовать
simplejson
библиотеку, в состав Python входит та же библиотека, что и вjson
модуле.Нет необходимости декодировать ответ из UTF8 в Unicode, метод
simplejson
/json
.loads()
может обрабатывать данные в кодировке UTF8.pycurl
имеет очень архаичный API. Если у вас нет особых требований для его использования, есть лучший выбор.requests
предлагает наиболее дружественный API, включая поддержку JSON. Если можете, замените ваш звонок на:источник
requests
! След, кажется, предполагает, чтоrequests
используетcomplexjson
, который используетsimplejson
. Weird.simplejson
если доступны; некоторые люди хотят использовать последнюю версию simplejson, а не ту, что входит в комплект Python stdlib.simplejson
использует встроенныйjson
под капотом, но дает больше описательных ошибок. В этом случае использованиеjson
просто даст вам общийValueError: No JSON object could be decoded
.u''
ответ). ВашJSONDecodeError
говорит вам, что много данных было успешно проанализировано, прежде чем он столкнулся с ошибкой; это может быть связано с тем, что в этой точке есть недопустимые данные (искаженный или поврежденный документ JSON) или из-за того, что данные были усечены.Проверьте тело данных ответа, присутствуют ли фактические данные, и дамп данных выглядит хорошо отформатированным.
В большинстве случаев ваша
json.loads
-JSONDecodeError: Expecting value: line 1 column 1 (char 0)
ошибка происходит из - за:В конечном итоге ошибка говорит о том, что в самой первой позиции строка уже не соответствует JSON.
Таким образом, если синтаксический анализ завершится неудачно, несмотря на наличие тела данных, которое на первый взгляд выглядит как JSON , попробуйте заменить кавычки тела данных:
Примечание: кавычки в данных должны быть правильно экранированы
источник
requests.get(url).json()
Just Works, JSON также не является уродливым.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
в частности происходит, когда вJSONDecodeError: Expecting value: line 1 column 1 (char 0)
также происходит, когда первая строка в ответе json неверна. Пример ответ от запуска вaz cli
команде находится["WARNING: The default kind for created storage account will change to 'StorageV2' from 'Storage' in the future", '{',
. Это дало мне ошибку, которая привела меня сюда. Остальная часть ответа является допустимым объектом json. Просто эта первая строка ломает вещи.С
requests
библиотекой lib этоJSONDecodeError
может произойти, если у вас есть код ошибки http, например 404, и вы пытаетесь проанализировать ответ как JSON!Вы должны сначала проверить на 200 (ОК) или позволить ему подняться при ошибке, чтобы избежать этого случая. Жаль, что это не удалось с менее загадочным сообщением об ошибке.
ПРИМЕЧАНИЕ : как отметил Martijn Pieters в комментариях, серверы могут отвечать JSON в случае ошибок (это зависит от реализации), поэтому проверка
Content-Type
заголовка более надежна.источник
Я думаю , что стоит отметить , что в тех случаях , когда вы разбираете содержимое самого файла JSON - здравомыслие проверка может быть полезна для того , чтобы вы на самом деле ссылаться
json.loads()
на содержимом файла, в отличии от пути к файлу этого JSON :Я немного смущен, чтобы признать, что это может иногда случаться:
источник
json.load()
вместо этого.Проверьте формат кодировки вашего файла и используйте соответствующий формат кодирования при чтении файла. Это решит вашу проблему.
источник
encoding='utf-8'
, так что я полагаю, иногда вам нужно попробовать несколько вещей.Часто это происходит потому, что строка, которую вы пытаетесь проанализировать, пуста:
Вы можете исправить, проверив,
json_string
пусто ли заранее:источник
response.read()
а затем был встревожен, когда другой вызов закончилсяExpecting value: line 1
и т. Д. Удалил оператор отладки и проблема была решена.Там могут быть встроены 0, даже после вызова decode (). Используйте replace ():
источник
У меня была именно эта проблема с использованием запросов. Спасибо Кристофу Русси за его объяснение.
Для отладки я использовал:
Я получал ответ 404 от API.
источник
response.status_code
илиprint(response.status_code)
.У меня была такая же проблема с запросами (библиотека python). Это случилось с
accept-encoding
заголовком.Это было установлено следующим образом:
'accept-encoding': 'gzip, deflate, br'
Я просто удалил его из запроса и перестал получать ошибку.
источник
Для меня это не было использование аутентификации в запросе.
источник
Для меня это был ответ сервера чем-то отличным от 200, и ответ не был отформатирован в json. Я закончил этим до разбора json:
источник
Я столкнулся с той же проблемой, когда печатал строку json, открытую из файла json, обнаружил, что строка json начинается с «ï» ¿, что при некотором повторном поиске происходит из-за того, что файл по умолчанию декодируется с помощью UTF-8, и изменив кодировку на utf-8-sig, разметка удаляется и без проблем загружает json:
источник
Если вы пользователь Windows, Tweepy API может создать пустую строку между объектами данных. Из-за этой ситуации вы можете получить сообщение об ошибке «JSONDecodeError: Ожидаемое значение: строка 1, столбец 1 (символ 0)». Чтобы избежать этой ошибки, вы можете удалить пустые строки.
Например:
Ссылка: API потока Twitter выдает JSONDecodeError («Ожидаемое значение», s, err.value) из None
источник
Просто проверьте, имеет ли запрос код состояния 200. Так, например:
источник
Я получил такую ошибку в ответе веб-API на основе Python
.text
, но он привел меня сюда, так что это может помочь другим с подобной проблемой (очень трудно отфильтровать ответ и запросить проблемы в поиске при использованииrequests
..)Использование
json.dumps()
по запросуdata
аргумента arg для создания правильно экранированной строки JSON, прежде чем POSTing решит проблему для меняисточник