Чтение и запись файлов JSON — обычная работа в Python. На самом деле наш анализ 888 кодовых баз показал, что 17% репозиториев либо читают, либо записывают в файлы JSON. Из этих 150 кодовых баз 25% усложняли себе жизнь, не используя встроенную функцию JSON. Ключевой частью нашей работы как разработчиков является снижение сложности кода, который мы пишем, так что это хорошая область улучшения для каждого четвертого разработчика Python.

В конце статьи есть ссылка на статистику. Вы можете проверить статистику. Вы никогда не знаете, ваше репо может быть одним из 888, которые мы проверили!

Многие случаи произошли в крупных проектах с открытым исходным кодом, так что это не просто ошибка новичка. Ради интереса мы перечислили несколько примечательных примеров в конце статьи.

Чтение файлов JSON

Вы когда-нибудь задумывались, почему json.loads заканчивается на s? Причина в том, что этот метод предназначен специально для работы со строкой, и есть другой родственный метод для работы с файлами: json.load.

json.loads предназначен для десериализации строки, содержащей JSON, а json.load (без 's') — для десериализации файла, содержащего JSON.

Методы очень связаны. По сути, json.load — это обертка вокруг json.loads. Это стандартный метод, предоставляемый Python для упрощения задачи чтения JSON из файловоподобных объектов. Например, они приводят к одному и тому же результату:

# bad
with open(‘some/path.json’, ‘r’) as f:
 content = json.loads(f.read())
# good
with open(‘some/path.json’, ‘r’) as f:
 content = json.load(f)

Так почему бы не выбрать самый простой для чтения и записи?

Написание файлов JSON

Подобно json.loads, json.dumps также заканчивается на s, потому что это специально для работы со строкой, и есть еще один связанный метод: json.dump

json.dumps предназначен для JSON-сериализации объекта в строку, а json.dump (без 's') — для JSON-сериализации объекта в файл.

Опять же, аналогично отношениям между json.load и json.loads, json.dump является оболочкой вокруг json.dumps. Это стандартный метод, предоставляемый Python для упрощения записи JSON в файлоподобный объект.

Например, они приводят к одному и тому же результату:

# bad
with open('some/path.json', 'w') as f:
    f.write(json.dumps({'foo': 'bar'}))
# good
with open('some/path.json', 'w') as f:
    json.dump({'foo': 'bar'}, f)

Так почему бы не выбрать самый простой для чтения и записи?

Уменьшить сложность

Разработчики ядра Python очень внимательно относятся к функциям, включенным во встроенные модули Python, потому что, как только они предоставляют API разработчикам, им очень трудно его удалить. Итак, нам дали несколько инструментов, которые упрощают работу с файлами JSON, поэтому имеет смысл использовать удобные методы, а не изобретать велосипед. По этой причине, когда Code Review Doctor видит разработчиков, не использующих json.load и json.dump, дается такой совет:

Примеры

Многие случаи произошли в крупных проектах с открытым исходным кодом, так что это не просто ошибка новичков, а скорее часто упускаемая из виду функция Python:

- Microsoft
- Ansible
- Unicef
- Sentry
- UK Department for International Trade

Статистика

Вы можете прочитать суть:
Чтение JSON: json.load vs json.loads
Запись JSON: json.dump vs json.dumps

Как мы нашли эту статистику? В CodeReview.doctor мы проводим статический анализ кодовых баз, чтобы найти баги и ошибки, которые пропускает большинство людей. В ходе этого процесса мы собираем статистику по публичным репозиториям. Мы отслеживали каждую строку, которую могли найти, где разработчики взаимодействовали с файлами JSON. Мы были удивлены результатами!

Если вы хотите проверить, не затрагивают ли вас подобные проблемы, немедленно бесплатно проверьте свою кодовую базу на CodeReview.doctor.