Границы преобразования JSON ↔ YAML и XML
Утверждение, что JSON — подмножество YAML, гарантирует только одно направление, а у XML вообще нет официального отображения в JSON — всё держится на соглашениях.
Преобразование между JSON и YAML, XML, CSV, TypeScript, Java, Go и SQL никогда не бывает без потерь. Главное — честно понимать, где эти потери происходят.
Статей: 8Утверждение, что JSON — подмножество YAML, гарантирует только одно направление, а у XML вообще нет официального отображения в JSON — всё держится на соглашениях.
CSV двумерен, JSON имеет древовидную форму. Сложность преобразования не в коде, а в том, чтобы заранее решить, как уплощаются массивы и как сохраняются типы.
Вложенные структуры, неоднородные поля и массивы массивов — вот где ломается преобразование JSON в таблицу. Четыре подхода, упорядоченные по времени до результата, каждый со своими компромиссами.
Превращение JSON в SQL INSERT скрывает разбиение на вложенные таблицы, NULL против отсутствия, экранирование и различия диалектов. Готовые к запуску запросы и сравнительные таблицы для каждой ловушки.
Генерация интерфейса по примеру JSON — половина работы: необязательные поля, null, объединения, даты и большие целые требуют ручной правки, а типы не дают валидации во время выполнения.
Самая копируемая команда из учебников, yq -P input.json > output.yaml, на yq v4 всё равно выдаёт JSON. В статье на выборке 2.39 MB замерены yq v4.44.6, PyYAML 6.0.3 и js-yaml, объясняется, почему формат вывода определяет расширение входа, и даются верные рецепты пакетного преобразования, кавычек, отступов и точности больших целых чисел.
Девять экспериментов на реальном конвертере: стратегия «ключи первой строки» молча теряет поля, null, отсутствие и пустая строка превращаются в одинаковые пустые ячейки, 20-значное целое теряет точность уже на JSON.parse, а точка в ключе сталкивает два разных пути в одной колонке. Как строится заголовок, какие значения искажаются и как выбрать стратегию по назначению данных ниже по потоку.
Практический замер того, что реально отдаёт генератор JSON → Java——числа становятся Double, вложенные объекты — статическими внутренними классами, и ни одной аннотации Jackson. Точность денег, переименование полей, стирание генериков, неизвестные поля и даты — пять вещей, которые придётся добавить руками, с кодом, готовым к копированию.