Инструменты разработчика · Конвертеры синтаксиса
Проблема Норвегии: YAML 1.1 против 1.2 и почему NO становится ложным
· Фон
ямл форматы данных отладка
В YAML 1.1 значение NO без кавычек является логическим, поэтому Норвегия исчезает из списков стран. В этом посте рассказывается история неявной типизации YAML, что изменилось в спецификации 1.2 и почему проблема сохраняется в сегодняшних инструментах.
Список стран, в которых отсутствует одна — НЕТ, анализируется как ложная, и отчет об ошибке из офиса в Осло.
Классическая ошибка — код страны без кавычек `NO` становится ложным. Тесты ToolAcre доказывают, что здесь этого не происходит: оба варианта схемы сохраняют `NO`, да, нет, включенным и выключенным в виде строк. История, начинающаяся с исчезновения Норвегии внутри этой панели, противоречила бы реализации.
Этот пример остается полезным в качестве предупреждения о совместимости. Когда другой потребитель YAML использует устаревшие правила, модуль записи ToolAcre цитирует неоднозначные строки, чтобы последующие читатели не интерпретировали их по-новому. Читатель и писатель настроены так, чтобы предотвратить тот самый сбой, который описан в схеме.
Норвегия не исчезает в этом конвертере: НЕТ остается текстом
В этом репозитории документированы ограниченные схемы JSON и Core js-yaml и их наблюдаемое скалярное поведение. Он не содержит источников происхождения YAML 2001, намерений авторов или исторических дебатов о дизайне. Эти утверждения скорее опускаются, чем восстанавливаются по памяти.
Текущего механизма достаточно для практического руководства. Простое скалярное разрешение происходит в соответствии с выбранной схемой; цитируемые значения остаются текстом; неподдерживаемые теги отклоняются. Свидетельства о коде не должны распространяться на неиспользованную историю стандартов.
Свидетельства репозитория охватывают текущую конфигурацию парсера, а не историю происхождения YAML.
YAML 1.1 обычно рассматривается как варианты «да», «нет», «включено» и «выключено» как логические значения. Это объясняет, почему проблема Норвегии существует в некоторых экосистемах. ToolAcre не предоставляет переключателя 1.1 и никогда не демонстрирует шестидесятеричное или устаревшее восьмеричное преобразование в таком режиме.
Используйте опасность для просмотра результатов внешнего анализатора, а не для прогнозирования этой панели. Если другой инструмент выдает ложное значение, запишите его библиотеку и схему. Результат ToolAcre может служить контрастным чтением YAML 1.2, но не доказательством того, что другая реализация настроена неправильно для своего контракта.
Устаревшие логические значения YAML 1.1 объясняют опасность, но здесь не включены.
Строгая схема JSON распознает только скалярное написание, совместимое с JSON. Core дополнительно преобразует тильду и пустые значения в нулевые, шестнадцатеричные или целые числа `0o`, а также неконечные числа. Ни один из них не расширяет логический словарь за пределы истинного и ложного.
Core Infinity и NaN позже становятся нулевыми в JSON с предупреждениями, поскольку JSON не имеет для них представления. Таким образом, разница между вариантами схемы заметна, а иногда и теряется, хотя само значение Норвегии остается стабильным.
Обе поставляемые опции представляют собой схемы YAML 1.2.
Унаследованное поведение сохраняется везде, где его сохраняют настройки синтаксического анализатора по умолчанию или соглашения приложения. Преобразователь не может инвентаризировать эти библиотеки или версии из свидетельств репозитория. Протестируйте реального потребителя с помощью прибора, содержащего неоднозначные слова и числовые аналоги.
Средство записи YAML ToolAcre добавляет защитные кавычки вокруг строк, которые читатели старшего возраста могут набирать по-другому, включая `NO`, `yes`, `1.0`, `0755` и текст, похожий на дату. Результаты совместимости измеримы и безопаснее, чем общее заявление о внедрении современных парсеров.
Опасность сохраняется и в других парсерах; проверяйте их, а не обобщайте с помощью этого инструмента
Преобразуйте `countries: [SE, NO, DK]`, `answers: [yes, no, on, off]`, `mode: 0755`, `octal: 0o755`, `version: 1.10` и `empty:`. В строгом режиме все значения, кроме JSON, остаются строками. В Core восьмеричное значение становится 493, а пустое становится нулевым; страна и слова ответа остаются строками.
Цитируйте каждый токен, чтобы принудительно ввести текст. Затем запишите результат JSON обратно в YAML и проверьте кавычки, которые выбирает сериализатор. Это сравнение с точностью до кода раскрывает правила инструмента, не притворяясь, что он выполняет режим YAML 1.1, которого не существует.
Рабочий пример: коды стран и скалярные аналоги в двух отправленных схемах.
Специфические для языка переключатели синтаксического анализатора, версии по умолчанию и оболочки платформы находятся за пределами этой реализации. Их имена и поведение меняются независимо. Проконсультируйтесь и протестируйте компонент, который будет использовать конфигурацию.
Панель также не проверяет семантику приложения. Сохранение `NO` в виде строки необходимо для кода страны, но оно не может доказать, что `NO` является допустимым значением в конкретной схеме.
Вывод: цитируйте свои строки, знайте версию своего парсера — и как преобразование YAML в JSON в браузере делает неявный ввод видимым.
Цитируйте текст, который можно перепечатать, знайте реально используемую схему и тестируйте потребителя. Две опции ToolAcre YAML 1.2 делают их ограниченные различия видимыми и сознательно избегают устаревшей логической ловушки.
Урок не в том, что каждый парсер ведет себя по-своему. Дело в том, что неявная типизация — это конфигурация, и преобразователь должен указать эту конфигурацию. Здесь доказательства говорят о том, что Норвегия остается `"NO"`.
Когда конфигурация пересекает системы, добавьте приспособление взаимодействия, содержащее все неоднозначные токены, разрешенные вашим доменом. Преобразуйте или проанализируйте его в каждом реальном потребителе и сравните типизированные значения, а не отображаемые YAML. Это улавливает устаревшую логическую таблицу, восьмеричное правило или разницу пустых значений до того, как список стран или режим разрешений попадут в рабочую среду. Цитирование известных строк остается простейшей переносимой защитой, поскольку оно записывает намерение в документе, а не полагается на настройки среды по умолчанию.