Найти в Дзене
Герман Геншин

JSONC против JSON: Правда о плюсах и минусах, которую все игнорируют!

Оглавление

JSON давно стал почти стандартом для хранения данных — его используют в API, сохранениях игр, настройках программ и много где ещё. Но многим кажется, что у формата есть недостатки, поэтому периодически появляются новые альтернативы. Одна из самых интересных — JSONC.

Что такое JSONC и зачем он вообще нужен?

JavaScript Object Notation (JSON) — это удобный для чтения текстовый формат для структурированных данных: всё строится на парах «ключ-значение», массивах и примитивных типах. Изначально его сделали похожим на JavaScript, отсюда и название. Но сейчас JSON работает почти везде — это универсальный способ передавать данные между разными языками и платформами.

Но, как и любой другой формат, JSON не идеален. Больше всего ругают его синтаксис:

Например, такой вариант не сработает в строгом JSON:

Вместо этого данные должны быть оформлены так:

JSONC как раз пытается сделать работу с JSON удобнее. По той же причине появились варианты вроде YAML и JSON5. Все эти форматы основаны на стандартном JSON, поэтому любой правильный JSON будет валиден и для них. Главное отличие — в том, насколько они меняют исходный синтаксис.

YAML идёт ещё дальше по сравнению с JSON: это не просто формат, а настоящий помощник для описания конфигураций и даже написания документаций. Можно делать вложенность через отступы, использовать свои типы данных, писать длинные тексты строками подряд — чем-то это даже напоминает гибрид Markdown и JSON. YAML популярен, например, в Docker Compose, GitHub Actions и Rails.

-2

JSON5, в свою очередь, старается быть максимально похожим на JavaScript и пытается решить все раздражающие мелочи стандартного JSON. При этом выглядит он почти как оригинал и уже реализован, например, в Chromium, Next.js и экосистеме macOS.

JSONC — это, по сути, «JSON с поддержкой комментариев». Главная фишка формата — можно прямо в структуре данных оставлять пояснения, совмещая лучшие стороны других форматов:

В JSONC доступны два классических способа для написания комментариев:

А вот вариант с единичным знаком «#» (как в bash) не поддерживается.

Комментарии через «#» чаще используют как раз в bash-скриптах, где нет других вариантов, но в других языках этот приём почти и не встречается.

Плюсы и подводные камни JSONC

Распространённость у JSONC гораздо ниже, чем у классического JSON — и это уже целый минус. Давайте посмотрим, чем же он всё‑таки хорош и есть ли шанс, что он вытеснит привычный формат.

Комментарии важнее, чем кажется!

На мой взгляд, возможность оставлять комментарии в данных — намного более весомый плюс, чем устранение мелких синтаксических неудобств. Да, удобные кавычки и запятые — это хорошо, но куда полезнее быстро документировать структуру данных. Благодаря поддержке комментариев JSON-файлы решают сразу две проблемы:

Понятно, что иногда комментарии нужны просто чтобы временно закомментировать куски кода при отладке, но в файлах с данными такое бывает редко. А если ещё и передавать такие данные другим системам, это может только запутать.

Но самое главное — это встроенная «документация»: если её нет, пояснения по полям и структуре приходится таскать по отдельным текстовым файлам, которые легко потерять. В качестве обходного пути иногда придумывают фейковые поля (например, info: "описание"), но с ними легко получить ошибки, если программа не умеет игнорировать незнакомые ключи.

Однако у комментариев есть и обратная сторона. Как говорил Дуглас Крокфорд, автор самого стандарта JSON:

Я специально убрал комментарии из JSON, потому что их стали использовать не по назначению — через них внедряли инструкции для парсеров, а это ломало совместимость.

То есть, комментарии — это потенциальная лазейка для хака формата. Поэтому запрет на них — своего рода способ держать стандарты под контролем.

Хвостовые запятые и необязательные кавычки по-прежнему запрещены

Как уже писал выше, для меня это не критично, но для многих — большой минус. Если уж дорабатывать оригинальный формат, было бы здорово сразу добавить поддержку хвостовых запятых: можно добавлять и удалять элементы без риска синтаксических ошибок. Причина такого ограничения — историческая, она идёт из развития стандарта JavaScript. Но никто не мешает уже сейчас сделать формат удобнее — главное захотеть.

Взаимная несовместимость форматов!

Да, формально JSONC расширяет стандартный JSON, и любой валидный JSON подойдёт для JSONC. Вот только большинство инструментов, рассчитанных на обычный JSON, не смогут корректно обработать файл с комментариями:

-3

Если вы работаете только для себя — проблем нет. Но именно эта несовместимость мешает формату стать по-настоящему массовым.

Предварительная обработка JSONC — не самое простое дело

Было бы просто преобразовать JSONC в стандартный JSON — проблем бы стало меньше. Например, можно использовать JSMin от Крокфорда. Но из-за особенностей синтаксиса комментариев парсер должен быть достаточно умным, чтобы правильно отличать их от содержимого.

Если бы, например, разрешались только комментарии, начинающиеся с «#» в самом начале строки, преобразование можно было бы реализовать в пару строк:

Это бы сильно упростило внедрение JSONC в любых парсерах: не пришлось бы переписывать существующую логику или подключать сторонние инструменты вроде JSMin.

Как попробовать JSONC прямо сейчас?

JSONC чаще всего встречается в настройках разных программ — например, fastfetch хранит конфиги именно в этом формате. Это удобно: можно сразу писать подсказки для себя и других пользователей.

Если вы разрабатываете свой софт и хотите поддерживать оба формата — JSON и JSONC, у вас два пути: использовать уже готовую утилиту JSMin и воспринимать JSONC как обычный JSON или подобрать библиотеку с поддержкой комментариев. Например, fastfetch использует yyjson на языке C — она умеет работать с комментариями и хвостовыми запятыми. Для JavaScript отлично подойдёт node-jsonc-parser от Microsoft — тут также весь расширенный синтаксис уже на месте.

Если вам понравилась эта статья, подпишитесь, чтобы не пропустить еще много полезных статей!

Премиум подписка - это доступ к эксклюзивным материалам, чтение канала без рекламы, возможность предлагать темы для статей и даже заказывать индивидуальные обзоры/исследования по своим запросам!Подробнее о том, какие преимущества вы получите с премиум подпиской, можно узнать здесь

Также подписывайтесь на нас в: