Выдает ошибку json.decoder.JSONDecodeError
Я новичок, еще только учу Python, учу самостоятельно по книге "Изучаем Python" Eric Matthes. Прохожу 10 главу, упражнение 11:
Любимое число: напишите программу, которая запрашивает у пользователя его любимое число. Воспользуйтесь функцией json.dump() для сохранения этого числа в файле. Напишите другую программу, которая читает это значение и выводит сообщение: «Я знаю ваше любимое число! Это _____».
Написал код:
import json
filename = "best_number.json"
try:
with open(filename, 'r', encoding="utf-8") as f:
bn = json.load(f)
except FileNotFoundError:
with open(filename, 'w') as f:
b_n = input("Введите ваше любимое число.")
json.dump(b_n, f)
else:
print(f'Я знаю ваше любимое число! Это {bn}!')
Выдает ошибку:
Traceback (most recent call last):
File "C:\Users\X550CC\Desktop\python\10\9.py", line 7, in <module>
bn = json.load(f)
File "C:\Users\X550CC\AppData\Local\Programs\Python\Python39\lib\json\__init__.py", line 293, in load
return loads(fp.read(),
File "C:\Users\X550CC\AppData\Local\Programs\Python\Python39\lib\json\__init__.py", line 346, in loads
return _default_decoder.decode(s)
File "C:\Users\X550CC\AppData\Local\Programs\Python\Python39\lib\json\decoder.py", line 337, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "C:\Users\X550CC\AppData\Local\Programs\Python\Python39\lib\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)
Подскажите пожалуйста, что я сделал не так.
Ответы (2 шт):
load() и loades() используются только с файлами json формата, для файлов и строк соответственно, load() function decodes a JSON file and returns a Python object, loads() is used to convert a JSON string into a Python object.
Частая проблема.
О чем говорит нам ошибка?
В документации к json.load() можно найти следующие строчки
Raises: JSONDecodeError – When the data being deserialized is not a valid JSON document
Вольный перевод
JSONDecodeError – когда десериализируемые данные не являются JSON документом
другими словами вы передаете в load все, что угодно, но только не документ формата json. Это может быть None, что указано у вас в вопросе, что тоже не является валидным значением.
Как исправить?
Быть уверенным, что точно передаете
json-> не хорошо и уверенность не может быть 100%Ловить исключение json.JSONDecodeError -> предпочтительное решение
try:
# ...
except FileNotFoundError:
# ...
except json.JSONDecodeError:
print("Ошибка: Некорректный JSON")
# ... необходимая обработка