Инструменты разработчика · Конвертеры синтаксиса
Сравнение четырех моделей данных: почему JSON, YAML, TOML и XML никогда не сопоставляют 1:1
· Фон
форматы данных JSON ямл
Каждое преобразование между этими форматами где-то происходит с потерями, поскольку каждый из них был разработан на основе другой модели данных. В этом посте сравниваются их системы типов и структуры, чтобы вы могли предсказать, что сохранится при преобразовании, а что упадет.
Конфигурация, которая не будет передаваться туда и обратно — файл, преобразованный в три формата, и поля, которые возвращаются разными.
Обычный объект, содержащий безопасные числа, строки, логические значения, массивы и вложенные объекты, может выдержать тесты JSON-to-YAML-to-JSON и JSON-to-TOML-to-JSON. Добавьте ноль перед TOML, дату и время из TOML, смешанный контент XML или комментарий YAML, и некоторые значения или исходная информация изменятся.
Полезный вопрос заключается не в том, является ли преобразование универсальным с потерями. Это то, какой входной класс и в каком направлении сохраняют нужные вам свойства. Предупреждения и отказы ToolAcre делают эту матрицу доступной для наблюдения, а не сводят каждую пару к одному маркетинговому обещанию.
Репрезентативная конфигурация может проходить через некоторые пары, но не через все поддерживаемые формы.
JSON предоставляет в этом парсере значения NULL, логические значения, числа, строки, массивы и объекты. Он не имеет комментариев, типа даты и времени или синтаксиса общей ссылки. JavaScript анализирует числа как IEEE-754, удваиваясь, поэтому уже не заключенное в кавычки целое число за пределами безопасного диапазона может потерять точность до того, как его увидит другой записывающий.
Ключи объекта представляют собой строки, и дополнительная сортировка меняет их представление. Массивы остаются упорядоченными. Строгий синтаксический анализ отклоняет комментарии, конечные запятые и неконечные числовые символы, устанавливая компактную основу для других читателей.
Модель ценности JSON, используемая в этой реализации JavaScript
ToolAcre принимает YAML через ограниченные JSON или основные схемы. Привязки и псевдонимы разрешаются, комментарии исчезают, потоки становятся массивами, повторяющиеся ключи сохраняют последнее значение с предупреждением, а рекурсивные или взрывные псевдонимы отклоняются.
Пользовательские теги, двоичные данные, метки времени, конструкторы наборов и языковых объектов отклоняются. Core Infinity и NaN становятся нулевыми в целевых форматах с предупреждениями. Это намеренно является подмножеством более широкой системы тегов YAML, а не претендует на полную поддержку объекта YAML.
Ограниченная модель YAML ToolAcre принимает
TOML начинается с таблицы и поддерживает строки, целые числа со знаком, числа с плавающей запятой, логические значения, массивы, таблицы и четыре временных типа. У него нет нуля. ToolAcre преобразует даты и время в строки, ориентированные на источник, а широкие целые числа в десятичные строки, а не теряют цифры.
При записи TOML нулевые ключи объекта опускаются, а нулевые записи массива становятся пустыми строками. Корневые массивы и скаляры отклоняются. Комментарии и выбор автора между заголовками, пунктирными ключами и встроенными таблицами не возвращаются через простое значение.
Корневая таблица TOML, временные значения и нулевая граница
XML проецируется как дерево с атрибутами `@`, обычными дочерними ключами, `#text`, `#cdata`, повторяющимися одноуровневыми массивами и буквальными префиксами пространства имен. Комментарии, объявления и инструкции по обработке удаляются. Позиция смешанного текста теряется, и невозможно определить одно против многих до появления повторений.
Значения читаются как строки, если не выбран вывод. Значение Null, записанное из JSON, становится пустым элементом и его невозможно отличить от пустой строки при возврате. Каждый DOCTYPE отклоняется, а недопустимые имена прекращают сериализацию, а не перезаписываются.
Проекция XML ToolAcre: элементы, атрибуты, текстовые и литеральные префиксы.
Доставка осуществляется в девяти направлениях: с JSON по YAML, XML, TOML и CSV; от YAML до JSON и TOML; от TOML до JSON и YAML; От XML до JSON. Обычные значения в форме JSON лучше всего работают между JSON и YAML. TOML вводит дату и нулевые границы. XML требует соглашений об именах и категориях узлов.
CSV — это плоский выброс и только выходные данные. Массивы или выбранные объекты становятся строками, вложенные пути преобразуются в пунктирные столбцы, слияния значений null с пустым текстом и строки, подобные формулам, нейтрализуются. CSV-к-JSON, XML-к-TOML и другие отсутствующие пары скорее отклоняются, чем выводятся.
Матрица совместимости для девяти направлений доставки, с CSV только в качестве вывода
Двоичные форматы и языки схем выходят за рамки. Схема может восстанавливать мощность списка или проверять бизнес-формы, тогда как двоичные кодировки вводят типы на уровне байтов и кадрирование, не представленные здесь. Конвертер никогда не заявляет о таких возможностях.
Преобразование синтаксиса также не доказывает корректность приложения. Чистое сообщение заказа YAML, XML в форме Kubernetes или файл проекта TOML по-прежнему может нарушать целевой контракт. Используйте валидатор домена после проверки сопоставления синтаксиса.
Вывод: выберите модель, затем синтаксис — и как панель конвертеров синтаксиса позволяет протестировать преобразование перед его выполнением.
Прежде чем выбирать пунктуацию, выберите модель данных. Если комментарии и псевдонимы имеют значение, переход JSON не сможет их сохранить. Если значение null имеет значение, вывод TOML меняет его. Если упорядоченное смешанное содержимое имеет значение, простой проекции JSON недостаточно. Если местом назначения является таблица, вложенная JSON требует явного соглашения о выравнивании.
Используйте ToolAcre, чтобы протестировать один репрезентативный документ и прочитать каждое предупреждение. Результатом является свидетельство о конкретной паре и входных данных, а не разрешение вызвать все преобразования без потерь или завершить каждый поддерживаемый синтаксический анализатор.
Создайте репрезентативный документ, исходя из границ, которые важны для вашего сервиса: пустой текст, большой идентификатор, строка, подобная дате, одна повторяющаяся запись, комментарий или псевдоним, если используется YAML, и смешанный текст, если используется XML. Сравните нормализованные значения после каждого поддерживаемого перехода и сохраните предупреждения вместе с результатом. Эта матрица становится артефактом решения для выбранной модели, а не смутным предпочтением знакомого синтаксиса.