Я получаю ошибку Expecting value: line 1 column 1 (char 0) при попытке декодировать JSON.
URL, который я использую для вызова API, отлично работает в браузере, но выдает эту ошибку при выполнении запроса curl. Ниже приведен код, который я использую для запроса curl.
Ошибка возникает при return simplejson.loads(response_json)
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 != 204and 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"
withopen(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, попробуйте заменить кавычки в теле данных:
Примечание: Кавычки внутри данных должны быть правильно экранированы
Ответ 4
С requests библиотекой JSONDecodeError может произойти ошибка, когда у вас есть код ошибки http, подобный 404, и вы пытаетесь проанализировать ответ как JSON!
Вы должны сначала проверить значение 200 (OK) или разрешить ему повышаться при ошибке, чтобы избежать этого случая. Я бы хотел, чтобы это завершилось неудачей с менее загадочным сообщением об ошибке.
ПРИМЕЧАНИЕ: как заявил Мартийн Питерс в комментариях, серверы могут отвечать JSON в случае ошибок (это зависит от реализации), поэтому проверка Content-Type заголовка более надежна.