Инструменты разработчика · Конвертеры синтаксиса
Действительно ли JSON YAML? Что обещает YAML 1.2 и где это нарушается
· Фон
JSON ямл форматы данных
YAML 1.2 был разработан таким образом, что каждый документ JSON также является документом YAML, поэтому преобразование JSON в YAML кажется тривиальным. В этом посте объясняется, что на самом деле гарантирует спецификация, а также крайние случаи, когда обещание не выполняется.
Вставка JSON в файл YAML и это сходит с рук — почему это работает, а один раз — нет
Обычный объект JSON можно вставить в исходную сторону YAML и прочитать в схеме YAML 1.2 JSON ToolAcre. Фигурные скобки, скобки, ключи в кавычках, строки, числа, логические значения и ноль становятся одним и тем же простым значением JavaScript. Это объясняет, почему граница часто кажется тривиальной.
Гарантия должна оставаться специфичной для анализатора. ToolAcre ограничивает теги, ограничивает псевдонимы и вложенность, а также применяет ограничение на ввод. Текст может быть действителен для более широкого процессора YAML, но здесь он может быть отклонен по соображениям безопасности или формы, не связанным с его ядром, похожим на JSON.
Обычный JSON загружается через этот YAML 1.2 ридер; неподдерживаемые расширения выходят из строя по разным причинам
Выбранные схемы создают значения в форме JSON: строки, числа, логические значения, значения NULL, массивы и сопоставления. Такое выравнивание позволяет выполнять синтаксический анализ, а затем сериализацию, а не замену знаков препинания. Исходный код не содержит всех формулировок и ошибок спецификации YAML, поэтому в статье сообщается о проверенном поведении, а не утверждается об исчерпывающем соответствии.
В строгом режиме тильда, пустое значение и `0o755` остаются строками. Это YAML токенов, которые JSON сам не содержит. Ядро разрешает их по-другому, продолжая возвращать выходные данные в форме JSON.
Поставляемые схемы соответствуют данным в форме JSON без проверки всех особенностей спецификации.
Дублированные ключи сопоставления YAML сохраняют последнее значение с предупреждением; строгая интерпретация в другом месте может их отвергнуть. Устаревшие читатели YAML 1.1 могут вводить такие слова, как `NO`, по-разному, в то время как этот читатель сохраняет их в виде строк. Эти различия усложняют общие заявления о переносимости.
Табуляция, используемая в качестве отступа, приводит к ошибке, тогда как табуляция внутри строк JSON в кавычках экранируется. Очень глубокие или слишком большие значения могут привести к нарушению локальных ограничений безопасности. Теоретические языковые отношения не отменяют границ реализации.
Дублирующиеся ключи и различия в устаревших синтаксических анализаторах остаются границами совместимости.
Обратное утверждение явно неверно для этого конвейера значений. Комментарии YAML не имеют представления JSON, псевдонимы преобразуются в повторяющиеся данные, потоки нескольких документов становятся массивами, а неподдерживаемые теги отклоняются. Блочные скаляры становятся строками, но их представление теряется.
Таким образом, даже поддерживаемый документ YAML может быть преобразован в действительный JSON и никогда не вернуться к тому же тексту YAML. Равенство данных может сохраняться для обычных значений, тогда как комментарии, привязки, правописание и идентификаторы потока — нет.
Что это означает для преобразования: JSON в YAML — это изменение стиля, YAML в JSON — это перевод, который может привести к потере информации.
JSON-to-YAML обычно представляет собой изменение стиля и сериализации для ввода в форме JSON. YAML-to-JSON сначала интерпретирует синтаксис, специфичный для YAML, а затем проецирует результат в модель меньшего значения JSON. Направления не симметричны.
ToolAcre проверяет обычные документы JSON-to-YAML-to-JSON, содержащие вложенные значения, Unicode, значения NULL, массивы и строки неоднозначного вида. Эти фикстуры подтверждают охватываемый класс данных, а не каждую возможную пару процессоров JSON или YAML.
Рабочий пример: документ JSON загружен как YAML — та же структура, затем добавлена функция только для YAML, чтобы показать, где останавливается инструмент JSON.
Вставьте `{"country":"NO","items":[1,null],"nested":{"ok":true}}` в качестве ввода YAML. Строгий читатель возвращает то же дерево. Добавьте комментарий YAML, и значение останется прежним, пока комментарий исчезнет. Замените повторяющийся объект привязкой и псевдонимом; JSON теперь содержит копии, а не ссылочный синтаксис.
Добавьте `---` и второй документ; результатом становится массив документов с предупреждением. Добавьте `!!binary`; ограниченный читатель отказывается от этого. Каждый шаг отмечает четкую границу: игнорируемое представление, разрешенная структура, соглашение о потоке и неподдерживаемый тип.
Что это не охватывает — совместимость на уровне схемы, где типы YAML, такие как временные метки, не имеют аналога JSON.
Совместимость схем касается не только поверхностного синтаксиса. Ядро может создавать Infinity или NaN, которые JSON записывает как нулевые с предупреждениями. Временные метки и двоичные теги в рамках ограниченных схем отвергаются, а не преобразуются. ToolAcre намеренно сужает YAML до безопасных данных в форме JSON.
Другая реализация YAML может поддерживать дополнительные типы. Это делает его менее совместимым с простыми значениями JSON в этих точках, а не автоматически лучше или хуже. Выбирайте в зависимости от целевого контракта и требований безопасности.
Совместимость на уровне схемы включает в себя неконечные значения и временные теги, которые ограниченный читатель ограничивает или отклоняет.
Обычные данные в форме JSON проходят без проблем через устройство чтения и записи YAML 1.2. Более широкие требования ко всем документам или анализаторам требуют исправлений, охватывающих повторяющиеся ключи, версии схемы, теги и ограничения ресурсов.
Используйте преобразователи синтаксиса, чтобы проверить фактический текст и прочитать его предупреждения. Считайте «JSON is YAML» полезным сокращением только после названия анализатора, схемы и неподдерживаемых функций, которые делают реальную границу точной.
Для теста на переносимость оставьте один прибор полностью внутри модели значений JSON, а другой, который добавляет по одной функции, доступной только для YAML, за раз. Пропустите оба через каждого предполагаемого потребителя. Первый измеряет практическое подмножество требований; второй точно определяет, где расходятся комментарии, псевдонимы, потоки, теги или скалярные правила. Этот поэтапный метод более информативен, чем абстрактный вопрос о том, являются ли два языка подмножествами, поскольку он приводит к ошибкам, связанным с парсерами, которые фактически использует ваша система.