В чем разница между словарем Python и форматом данных JSON
Что проверяют
Различаете ли вы структуру данных в памяти и текстовый формат обмена и знаете ли, что теряется при переходе между ними. Следом часто просят сериализовать datetime или Decimal и спрашивают, что станет с ключом-числом.
Как отвечать
Главное: словарь это объект Python в памяти, JSON это строка текста по стандарту RFC 8259. Синтаксис похож, но между ними всегда стоит сериализация.
- ключи: в словаре ключом может быть любой хешируемый объект (
int,tuple,frozenset), в JSON только строки.json.dumps({1: "a"})даст{"1": "a"}, и послеjson.loadsключ вернётся строкой. Ключ-кортеж вызоветTypeError, если не передатьskipkeys=True; - типы: JSON знает строку, число,
true/false,null, массив и объект.tupleстанет массивом и вернётся списком, аset,datetime,Decimal,bytesвызовутTypeError. Решается через параметрdefault=или подклассjson.JSONEncoder; - синтаксис: в JSON только двойные кавычки, нет висячих запятых и комментариев,
TrueиNoneпишутся какtrueиnull; - нестандартные числа:
float("nan")модульjsonпо умолчанию выводит какNaN, что нарушает стандарт. Строгий режим включаетallow_nan=False; - API:
json.dumps/json.loadsработают со строками,json.dump/json.loadс файлами. Для кириллицы нуженensure_ascii=False, иначе получите экранированные\uпоследовательности.
Хорошо дополнить практикой: в реальных проектах сериализацию и валидацию часто берут на себя Pydantic (model_dump_json(), model_validate_json()) или быстрый orjson, который сам умеет datetime и dataclass.
Где спотыкаются
Выдают str(my_dict) за JSON. Получаются одинарные кавычки и True/None, которые другой сервис не распарсит.
Думают, что json.loads(json.dumps(d)) == d верно всегда. Равенство ломается на нестроковых ключах и кортежах: данные возвращаются в другом виде.
Путают dumps и dump или передают в json.loads уже готовый словарь, например результат response.json() из requests, и получают TypeError.