YAML в качестве надстрочного символа JSON и символов TAB

Я не могу найти ссылку на эту ошибку точно, но YAML 1.2 говорит, что это надмножество JSON, и если я использую символы табуляции в JSON, это относится к нему как к ошибке.

например.

"root": {
        "key": "value"
}

(Онлайн-проверка здесь говорит, что '\t' that cannot start any token)

Я знаю, почему YAML исторически запрещает вкладки, но как я могу интерпретировать это в контексте JSON-superset?

(например, ЯмЛ не является фактическим надмножеством или JSON также запрещает табуляции? Или спецификация позволяет делать вкладки в этом случае, но реализация еще не существует?)

Спасибо.

Ответ 1

В YAML разрешены вкладки, но только там, где отступы не применяются.

Согласно YAML 1.2 Раздел 5.5:

YAML распознает два пробела: пробел и вкладку.

Следующие примеры будут использовать · для обозначения пробелов и для обозначения вкладок. Все примеры могут быть проверены с использованием официального YAML Reference Parser.

YAML имеет стиль блока и стиль потока. В блочном стиле отступ определяет структуру документа. В следующем документе используется стиль блока.

root:
··key: value

Подтвердить

В стиле потока специальные символы указывают структуру документа. Следующий эквивалентный документ использует стиль потока.

{
→ root: {
→ → key: value
→ }
}

Подтвердить

Вы даже можете смешивать отступы в стиле потока.

{
→ root: {
··→ key: value
····}
}

Подтвердить

Если вы смешиваете стиль блока и потока, вся часть стиля потока должна уважать отступ в стиле блока.

root:
··{
····key: value
··}

Подтвердить

Но вы можете смешать свой отступ внутри части стиля потока.

root:
··{
··→ key: value
··}

Подтвердить

Если у вас есть документ с одним значением, вы можете объединить это значение со всеми путями.

→ ··value··→ 

Подтвердить

Дело в том, что каждый документ JSON, который анализируется как YAML, поместит документ в стиль потока (из-за начального символа { или [), который поддерживает вкладки, если только это не единственный документ JSON, в в этом случае YAML по-прежнему позволяет заполнять пробелы.

Если анализатор YAML выбрасывается из-за вкладок в документе JSON, это недействительный синтаксический анализатор.

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

root: {
··key: value
}

недействителен, однако

root:
··{
····key: value
··}

valid и

root: { key: value }

также valid.

Ответ 2

Я знаю, почему YAML исторически запрещает вкладки, но как я могу интерпретировать это в контексте JSON-superset?

Принимая во внимание остальную часть спецификаций, мы можем только заключить, что комментарий "суперсет" является неточным. Спецификация YAML принципиально несовместима в Относительно секции JSON:

YAML можно рассматривать как естественное дополнение JSON, предлагая улучшенная читаемость человека и более полная информационная модель. Эта также имеет место на практике; каждый JSON файл также является допустимым YAML файл. Это облегчает переход из JSON в YAML, если/если необходимы дополнительные функции.

JSON RFC4627 требует, чтобы клавиши сопоставления просто "СЛЕДУЕТ" были уникальными, в то время как YAML настаивает на том, что они "ДОЛЖНЫ". Технически, YAML поэтому соответствует спецификации JSON, выбирая обработку дубликатов как ошибку. На практике, поскольку JSON умалчивает о семантике таких дубликатов, единственными портативными файлами JSON являются те, у которых есть уникальные ключи, которые поэтому действительные файлы YAML.

Несмотря на то, что YAML является "естественным надмножеством JSON" и утверждает, что "каждый JSON файл также является допустимым файлом YAML", спецификация немедленно отмечает некоторые отличия в отношении уникальности ключа. Разумеется, спецификация также должна учитывать различия вокруг использования вкладок для отступов здесь.

Говоря о том, что, как подразумевал валидатор, YAML явно запрещает табуляции как символы отступа:

Чтобы сохранить переносимость, символы табуляции не должны использоваться в отступы, так как разные системы обрабатывают вкладки по-разному. Обратите внимание, что большинство современных редакторов могут быть настроены так, что нажатие клавиши табуляции приводит к введению соответствующего количества пробелов.

Это, конечно, более строгая, чем спецификация

Ответ 3

В соответствии с спецификация вкладки никогда не разрешены. Итак, когда JSON используется внутри YAML, он не позволяет вкладки.

Проблема возникает, когда мы считаем JSON чистым подмножеством YAML. Но это не так, согласно разделу Relation to JSON в спецификации, есть некоторые мелочи, которые не позволяют json быть чистым подмножеством YAML.

Если мы обратимся к этим несходствам, нам понадобится нечто вроде YSON, о котором также говорится в спецификации.

Но, к счастью, есть несколько двигателей YAML, которые поддерживают вкладки как отступы. Snakeyml является примером для этого.