Выдает ошибку 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 шт):

Автор решения: Limonello

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.

→ Ссылка
Автор решения: Dmitry

Частая проблема.

О чем говорит нам ошибка?

В документации к json.load() можно найти следующие строчки

Raises: JSONDecodeError – When the data being deserialized is not a valid JSON document

Вольный перевод

JSONDecodeError – когда десериализируемые данные не являются JSON документом

другими словами вы передаете в load все, что угодно, но только не документ формата json. Это может быть None, что указано у вас в вопросе, что тоже не является валидным значением.

Как исправить?

  1. Быть уверенным, что точно передаете json -> не хорошо и уверенность не может быть 100%

  2. Ловить исключение json.JSONDecodeError -> предпочтительное решение

try:
# ...
except FileNotFoundError:
# ...
except json.JSONDecodeError:
    print("Ошибка: Некорректный JSON")
    # ... необходимая обработка
→ Ссылка