В чем разница между YAML и JSON?

736

Каковы различия между YAML и JSON, особенно учитывая следующие вещи?

  • Производительность (время кодирования / декодирования)
  • Потребление памяти
  • Ясность выражения
  • Доступность библиотеки, простота использования (я предпочитаю C)

Я планировал использовать один из этих двух компонентов в нашей встроенной системе для хранения файлов конфигурации.

Связанные с:

Должен ли я использовать YAML или JSON для хранения данных Perl?

pierrotlefou
источник
26
Имейте в виду, что JSON можно считать подмножеством YAML: en.wikipedia.org/wiki/JSON#YAML
Charles
2
@ Чарльз, да, но у них есть небольшая
pierrotlefou
1
Поскольку YAML (приблизительно) является надмножеством JSON, на вопрос производительности невозможно ответить без предположений о том, будете ли вы использовать эту выразительность. Если вам это не нужно: насколько быстро парсеры YAML читают JSON? Если вам это нужно: насколько медленнее будут синтаксические анализаторы JSON, когда вы допускаете более длинное представление JSON той же идеи?
Poolie
@jokoon Я думаю, я бы предпочел библиотеку C (например, libyaml)
dbr
4
Документы YAML могут быть сложными и трудными для чтения. Атака "Миллиард смеха" возможна с YAML. С другой стороны, сложные объекты, графы и другие структуры могут быть эффективно сериализованы в YAML. Для форматов обмена и простых структур предпочтительным является JSON. Для сериализации сложных объектов или для грамматических определений YAML может быть предпочтительным.
Эрик Аронести

Ответы:

659

Технически YAML - это расширенный набор JSON. Это означает, что, по крайней мере, теоретически, синтаксический анализатор YAML может понимать JSON, но не обязательно наоборот.

См. Официальные спецификации в разделе «YAML: отношение к JSON» .

В целом, есть некоторые вещи, которые мне нравятся в YAML, которых нет в JSON.

  • Как отметил @jdupont , на YAML визуально легче смотреть. На самом деле домашняя страница YAML сама по себе является действительной YAML, но человеку легко ее читать.
  • YAML имеет возможность ссылаться на другие элементы в файле YAML с помощью «якорей». Таким образом, он может обрабатывать реляционную информацию, которую можно найти в базе данных MySQL.
  • YAML более надежен для встраивания других форматов сериализации, таких как JSON или XML, в файл YAML.

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

Прямо сейчас AJAX и другие веб-технологии обычно используют JSON. YAML в настоящее время больше используется для обработки данных в автономном режиме. Например, он включен по умолчанию в пакет компьютерного зрения OpenCV на основе C, а JSON - нет.

Вы найдете библиотеки C для JSON и YAML. Библиотеки YAML имеют тенденцию быть более новыми, но у меня не было проблем с ними в прошлом. Смотрите, например, Yaml-CPP .

AndyL
источник
199
JSON не является подмножеством (хотя оно и близко), и несовместимости приводят в бешенство, когда вы их поощряете. Библиотеки json обычно работают быстрее ... ( stackoverflow.com/questions/2451732/… ). Сторонники yaml будут настаивать на том, что это подмножество. если удобочитаемость, используйте yaml. если важны совместимость и скорость, используйте JSON.
Эрик Аронесты
7
YAML - это расширенный набор определенной формы синтаксиса JSON. То есть, если вы используете JSON способом, совместимым с YAML, то это правильное подмножество. Как прокомментировал Pierr выше, спецификации [направлены на совместимость] (ajaxian.com/archives/json-yaml-its-getting-closer-to-truth).
naught101
120
Также YAML поддерживает комментарии, что удобно.
День
59
@ErikAronesty JSON был близок к подмножеству YAML 1.1, но, начиная с YAML 1.2, теперь это настоящее подмножество. YAML 1.2 был первоначально выпущен для того, чтобы сгладить последние несколько несовместимостей между двумя спецификациями.
00promeheus
64
Из спецификации YAML 1.2 : «Основная цель этого пересмотра - привести YAML в соответствие с JSON в качестве официального подмножества».
Рич С
205

Отличия:

  1. YAML, в зависимости от того, как вы его используете, может быть более читабельным, чем JSON
  2. JSON часто быстрее и, вероятно, все еще совместим с большим количеством систем
  3. Можно очень быстро написать «достаточно хороший» анализатор JSON
  4. Дублирующиеся ключи, которые являются потенциально допустимым JSON, определенно являются недействительными YAML.
  5. YAML обладает множеством функций, включая комментарии и реляционные привязки. Синтаксис YAML, соответственно, довольно сложный и может быть сложным для понимания.
  6. В yaml: можно написать рекурсивные структуры {a: &b [*b]}, которые в некоторых конвертерах будут выполняться бесконечно. Даже при круговом обнаружении «бомба ямла» все еще возможна (см. Бомбу XML ).
  7. Поскольку нет ссылок, невозможно сериализовать сложные структуры с объектными ссылками в JSON. Поэтому сериализация YAML может быть более эффективной.
  8. В некоторых средах кодирования использование YAML может позволить злоумышленнику выполнить произвольный код .

Замечания:

  1. Программисты Python, как правило, являются большими поклонниками YAML из-за использования отступов, а не синтаксиса в квадратных скобках, для указания уровней.
  2. Многие программисты считают, что привязанность значения к отступу является плохим выбором.
  3. Если формат данных выходит из среды приложения, анализируется в пользовательском интерфейсе или отправляется на уровне обмена сообщениями, JSON может быть лучшим выбором.
  4. YAML может использоваться непосредственно для сложных задач, таких как определения грамматики, и часто является лучшим выбором, чем изобретение нового языка.
Эрик Аронесты
источник
9
Это. Цель Yaml 1.2 заключалась в том, чтобы устранить несколько различий в совместимости, чтобы сделать JSON строгим подмножеством. Если вы считаете, что спецификация не достигла своей цели, Эрик, пожалуйста, укажите где-нибудь пример допустимого JSON, который нарушает спецификацию YAML и / или нарушает верифицированный 1.2-совместимый синтаксический анализатор YAML.
SFEley
33
@SFEley Спецификация YAML говорит, что существуют потенциально допустимые файлы JSON, которые будут недействительными YAML. Но это вряд ли в реальном использовании. «JSON RFC4627 требует, чтобы сопоставления ключей просто« ДОЛЖНЫ »быть уникальными, в то время как YAML настаивает на том, что они« ДОЛЖНЫ »быть. Технически, поэтому YAML соответствует спецификации JSON, решив рассматривать дубликаты как ошибку. На практике, поскольку JSON ничего не говорит о В семантике таких дубликатов единственными переносимыми файлами JSON являются файлы с уникальными ключами, которые, следовательно, являются действительными файлами YAML. " - yaml.org/spec/1.2/spec.html#id2759572
Дэвид С. Бишоп
9
Прокомментировать использование отступа; ну, я считаю, что это может потребовать привыкания, и не всем это понравится. Например, я парень .NET. Я смотрел на файл travis.yml и задавался вопросом, почему возникла проблема. Я узнал, что у меня есть вкладка, где его не должно быть. Не все привыкли к взрыву из-за предпочтений пробела / табуляции / новых строк.
Фил
10
Вкладки просто не допускаются как символы отступа. ИМХО, это хороший стиль кодирования на всех языках - с синтаксическим отступом или без него.
00promeheus
6
@Wyrmwood Я лично люблю Python и YAML и буквально использую их каждый день. Я склонен использовать YAML для вещей, которые людям часто приходится редактировать, и JSON для вещей, на которые людям «возможно» нужно смотреть. Я был подвергнут действительной критике со стороны разработчиков C ++, которые считают, что отступы сбивают с толку ... особенно, если есть несколько уровней или более длинные функциональные блоки. Конечно ... у хорошего тестируемого кода таких вещей нет, поэтому обычно это не проблема. Это мое личное наблюдение, но любой случайный поиск в Google даст много результатов ... так что это тривиально проверить.
Эрик Аронесты
89

В обход эзотерической теории

Это отвечает названию, а не деталям, так как большинство просто читает заголовок из результатов поиска на Google, как я, поэтому я чувствовал, что это необходимо объяснить с точки зрения веб-разработчика .

  1. YAML использует отступы в пространстве, что является привычной территорией для разработчиков Python.
  2. Разработчики JavaScript любят JSON, поскольку он является подмножеством JavaScript и может напрямую интерпретироваться и записываться в JavaScript вместе с кратким способом объявления JSON, не требующим двойных кавычек в ключах при использовании типичных имен переменных без пробелов.
  3. Существует множество синтаксических анализаторов, которые очень хорошо работают на всех языках как для YAML, так и для JSON.
  4. Космический формат YAML во многих случаях может быть намного проще для просмотра, потому что форматирование требует более удобочитаемого подхода.
  5. Форма YAML, будучи более компактной и удобной для просмотра, может быть обманчиво трудной для редактирования вручную, если в редакторе нет видимого форматирования пространства. Вкладки не являются пробелами, поэтому это еще больше сбивает с толку, если у вас нет редактора для интерпретации ваших нажатий клавиш в пробелы.
  6. JSON намного быстрее сериализуется и десериализуется из-за значительно меньшего количества функций, чем проверяемый YAML, что позволяет меньшему и более легкому коду обрабатывать JSON.
  7. Распространенным заблуждением является то, что YAML требует меньше знаков препинания и является более компактным, чем JSON, но это полностью неверно. Пробел невидим, поэтому кажется, что символов меньше, но если вы посчитаете фактический пробел, который необходим для правильной интерпретации YAML вместе с правильным отступом, вы обнаружите, что YAML на самом деле требуется больше символов, чем JSON. JSON не использует пробелы для представления иерархии или группировки, и его можно легко сгладить, удалив ненужные пробелы для более компактной транспортировки.

Слон в комнате: сам интернет

JavaScript так явно доминирует в сети с огромным преимуществом, и разработчики JavaScript предпочитают использовать JSON в качестве формата данных в подавляющем большинстве наряду с популярными веб-API, поэтому становится трудно спорить об использовании YAML над JSON при выполнении веб-программирования в общем смысле, так как вы, вероятно, будете отстранены в командной среде. На самом деле, большинство веб-программистов даже не знают о существовании YAML, не говоря уже о том, чтобы использовать его.

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

Джейсон Себринг
источник
10
Я не согласен с тем, что разработчики Python предпочитают YAML. Диктофон Pythons в основном JSON, список диктов также в основном JSON. Python имеет встроенную библиотеку json. Кстати, я разработчик Python и предпочитаю JSON (большинство известных мне разработчиков Python предпочитают JSON).
Карантан
6
Одна вещь, которая действительно беспокоит меня о пустом пространстве, это то, как легко запутаться и ошибиться, так как отступ или нет может означать его вложенность или на том же уровне, а также очень легко ошибиться, если вы этого не сделаете есть руководство правило. это как скрытый упс, это действительно не тот простой сценарий типа, который никто не говорит при редактировании yaml. никогда не было такой проблемы с JSON.
Джейсон Себринг,
6
@JasonSebring. Вы почти удивитесь, почему YAML пошел с пробелами. Мое первое «погружение в океан» YAML привело к поломке приложения… и все из-за пробелов. Вы бы подумали, что, возможно, использование отступа без непечатных символов имело бы гораздо больше смысла! (То есть, почему они не выбрали «.», А не «»?) Чтобы понять YAML, вы должны перейти к спецификациям. Для понимания JSON это не нужно. (Я был на первом, и никогда на втором). Для меня это указывает на формат, который на самом деле не «читается человеком»
cmroanirgo
7
@cmroanirgo да, это был мой опыт. Мой босс заставил нас использовать YAML вместо JSON, и это сделало вещи бесполезными для редактирования и загрузки. Я написал это из-за того, что голосование в надежде оправдать меня.
Джейсон Себринг
3
Проблема с вкладками в YAML означает (а) отсутствие чтения сообщения об ошибке и (б) наличие редактора, который не выделяет вкладки. Обе проблемы легко исправимы, поэтому я не понимаю жалоб.
toolforger
38

Этому вопросу 6 лет, но, как ни странно, ни один из ответов на самом деле не затрагивает все четыре пункта (скорость, память, выразительность, портативность).

скорость

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

Однако, учитывая , что файл YAML может быть немного меньше , чем его аналог JSON (за счет меньшего количества "и ,символы), это возможно , что оптимизированная YAML парсер может быть быстрее , в исключительных обстоятельствах.

Память

В основном применяется тот же аргумент. Трудно понять, почему синтаксический анализатор YAML мог бы быть более эффективным с точки зрения памяти, чем анализатор JSON, если они представляют одну и ту же структуру данных.

Выразительность

Как отмечали другие, программисты на Python предпочитают программировать на YAML, JavaScript, а не JSON. Я сделаю эти наблюдения:

  • Легко запомнить весь синтаксис JSON и, следовательно, быть очень уверенным в понимании смысла любого файла JSON. ЯМЛ не совсем понятен любому человеку. Количество тонкостей и крайних случаев крайне.
  • Поскольку немногие парсеры реализуют всю спецификацию, еще сложнее быть уверенным в значении данного выражения в данном контексте.
  • Отсутствие комментариев в JSON на практике является настоящей болью.

портативность

Трудно представить современный язык без библиотеки JSON. Также сложно представить JSON-парсер, реализующий что-то меньшее, чем полная спецификация. YAML имеет широкую поддержку, но менее распространен, чем JSON, и каждый анализатор реализует свое подмножество. Следовательно, файлы YAML менее совместимы, чем вы думаете.

Резюме

JSON - победитель за производительность (если уместно) и совместимость. YAML лучше для файлов, поддерживаемых человеком. HJSON - достойный компромисс, хотя и с гораздо меньшей переносимостью. JSON5 - более разумный компромисс с четко определенным синтаксисом.

Стив Беннетт
источник
3
Я действительно думал, что YAML был меньше из-за невидимых персонажей, которые обманули меня как таковую. Невидимый => Не там, ну на самом деле нет. Если вы посчитаете, что невидимые символы должны быть там, особенно если YAML увеличивается в размерах, он быстро превосходит JSON. Я просто подумал, что это было очень интересно, поскольку читаемая человеком часть вводит в заблуждение большинство из нас, пока я действительно не подумаю об этом, поскольку вы можете сгладить JSON и YAML, не так уж много. Я также обнаружил, что YAML очень сложно редактировать вручную, а не читать, просто редактировать, так как вам нужны включенные руководства редактора, которые иногда легко ошибаются во вложенных элементах.
Джейсон Себринг,
1
Я чувствую, что ни один из ответов здесь явно не говорит об этом: «Для файлов настроек / конфигурации YAML лучше (по причинам, упомянутым выше всеми). Для взаимодействия машина / машина используйте JSON». Другими словами: если ваша целевая аудитория - человек, YAML лучше. Если целью является другая программа (но вы все еще хотите, чтобы данные были удобочитаемыми для человека), используйте JSON.
Флорин Т.
Это правда, но в вопросе изложены некоторые довольно специфические параметры о том, как они хотят, чтобы они сравнивались. Лично я бы ни за что не использовал YAML. Я бы либо использовал JSON для совместимости, либо JSON6, если обслуживание человека важно.
Стив Беннетт
29

GIT и YAML

Другие ответы хороши. Прочитайте те сначала. Но я добавлю еще одну причину использовать YAML: git .

Все больше и больше программных проектов используют репозитории git для распространения и архивирования. И хотя история репозитория git может в равной степени хранить файлы JSON и YAML, метод diff, используемый для отслеживания и отображения изменений в файле, ориентирован на строки. Поскольку YAML вынужден ориентироваться на строки, любые небольшие изменения в файле YAML легче увидеть человеку.

Конечно, это правда, что файлы JSON можно «сделать красивыми», отсортировав строки / ключи и добавив отступы. Но это не по умолчанию, и я ленивый.

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

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

JohnAD
источник
22

Я считаю, что YAML проще для глаз: меньше скобок, "" и т. Д. Хотя в YAML есть раздражение от вкладок ... но это можно понять.

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

Кроме того, мы говорим о файлах конфигурации, и поэтому я не ожидаю высокой частоты кодирования / декодирования, не так ли?

jldupont
источник
22
Мне было интересно, что вы имели в виду под раздражением вкладок . Я считаю, что в yaml запрещены символы табуляции , что лично мне кажется хорошей идеей в любом исходном файле .
пул
6
@poolie: jldupont, скорее всего, относится к синтаксически значимым пробелам в YAML.
naught101
10
ОК, но они не вкладки.
пул
20

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


источник
3
каким образом YAML является более сложным?
Accatyc
18
Например, YAML поддерживает якоря, как было отмечено в другом ответе. Есть и другие функции, такие как расширяемые типы данных. Это усложняет анализ и объясняет, почему YAML обладает большей спецификацией. Это может ухудшить производительность в зависимости от реализации синтаксического анализатора (взгляните на этот вопрос: stackoverflow.com/questions/2451732/… ).
Антон Строгонов
5
Сложность лучше, чем простота, если эта сложность дает вам силы для достижения большей простоты. Это, безусловно, верно в зависимости от сложности вашей модели данных.
Джонатан Нойфельд,
3
Я могу немного опоздать, но YAML может добавлять комментарии, а JSON - нет. Для меня это большая помощь, когда дело доходит до документации спецификаций
Моисей Ляо GZ
@Accatyyc. Я думаю, что тот факт, что люди здесь задают вопросы о разнице, является верным признаком того, что YAML не так просто. Я никогда не задавал вопрос о JSON (кроме «почему я не могу
оставлять
15

Технически YAML предлагает гораздо больше, чем JSON (YAML v1.2 - это расширенный набор JSON):

  • Комментарии
  • якоря и наследование - пример 3 одинаковых предметов:

    item1: &anchor_name
      name: Test
      title: Test title
    item2: *anchor_name
    item3:
      <<: *anchor_name
      # You may add extra stuff.
  • ...

В большинстве случаев люди не будут использовать эти дополнительные функции, и главное отличие состоит в том, что YAML использует отступы, а JSON использует скобки . Это делает YAML более лаконичным и читаемым (для тренированных глаз).

Какой выбрать?

  • Дополнительные функции YAML и лаконичная запись делают его хорошим выбором для файлов конфигурации (не предоставленных пользователем файлов).
  • Ограниченные возможности JSON , широкая поддержка и более быстрый анализ делают его отличным выбором для обеспечения взаимодействия и предоставления данных пользователем .
Wernight
источник
4

Поскольку этот вопрос теперь занимает заметное место при поиске YAML и JSON, стоит отметить одно редко цитируемое различие между ними: лицензия. JSON претендует на то, чтобы иметь лицензию, которой должны придерживаться пользователи JSON (включая юридически неоднозначное «должно использоваться для Добра, а не Зла»). YAML не имеет такой лицензии, и это может быть важным отличием (для вашего адвоката, если не для вас).

Mvr39
источник
Я не использую JSON, я использую точный эквивалент JSON, не называя его JSON. Я называю это PS-OFF. Вы собираетесь судиться со мной за использование { "": #, [] }???
Андрей
4

Иногда вам не нужно выбирать одно за другим.

В Go, например, вы можете иметь оба одновременно:

type Person struct {
    Name string `json:"name" yaml:"name"`
    Age int `json:"age" yaml:"age"`
}
Майкл Дорнер
источник
3

От: Arnaud Lauret Book «Дизайн веб-API». :

Формат данных JSON

JSON - это текстовый формат данных, основанный на том, как язык программирования JavaScript описывает данные, но, несмотря на свое название, полностью не зависит от языка (см. Https://www.json.org/ ). Используя JSON , вы можете описывать объекты, содержащие неупорядоченные пары имя / значение, а также массивы или списки, содержащие упорядоченные значения, как показано на этом рисунке.

введите описание изображения здесь

Объект ограничен фигурными скобками ({}). Имя является строкой в ​​кавычках («имя») и отделяется от значения двоеточием (:). Значением может быть строка типа «значение», число типа 1.23, логическое значение (истина или ложь), нулевое значение нуль, объект или массив. Массив ограничивается скобками ([]), а его значения разделяются запятыми (,). Формат JSON легко разбирается с использованием любого языка программирования. Это также относительно легко читать и писать. Он широко применяется для многих целей, таких как базы данных, файлы конфигурации и, конечно, API.

YAML

YAML (YAML - это не язык разметки) - это удобный для пользователя формат сериализации данных. Как и JSON, YAML ( http://yaml.org ) является форматом данных ключ / значение. На рисунке показано сравнение двух.

введите описание изображения здесь

Обратите внимание на следующие моменты:

  • В именах и значениях свойств в YAML нет двойных кавычек ("") .

  • Структурные фигурные скобки JSON ({}) и запятые (,) заменяются на новые строки и отступы в YAML .

  • Скобки ([]) и запятые (,) заменяются черточками (-) и символами новой строки в YAML .

  • В отличие от JSON , YAML допускает комментарии, начинающиеся с хеш-метки (#). Относительно легко преобразовать один из этих форматов в другой. Будьте предупреждены, однако, вы потеряете комментарии при преобразовании документа YAML в JSON .

HS Progr
источник
0

Я считаю, что YAML и JSON очень эффективны. Единственные две вещи, которые действительно диктуют, когда одна используется поверх другой для меня, это одна, с которой язык используется наиболее популярно. Например, если я использую Java, Javascript, я буду использовать JSON. Что касается Java, я буду использовать их собственные объекты, которые в значительной степени являются JSON, но в них отсутствуют некоторые функции, и преобразовать их в JSON, если мне нужно, или сначала сделать это в JSON. Я делаю это, потому что это обычное явление в Java и позволяет другим разработчикам Java модифицировать мой код. Во-вторых, использую ли я это для программы, чтобы запомнить атрибуты, или если программа получает инструкции в виде файла конфигурации, в этом случае я буду использовать YAML, потому что он очень легко читается человеком, имеет хороший выглядит синтаксис, и его очень легко изменить, даже если вы не знаете, как работает YAML. Затем программа прочитает его и преобразует в JSON или любой другой формат, предпочтительный для этого языка.

В конце концов, это, честно говоря, не имеет значения. И JSON, и YAML легко читаются любым опытным программистом.

Triforcey
источник
-1
  • JSON не может обрабатывать большие данные, сравнивая yml

  • Не подходит для обработки различных мультимедийных форматов.

  • JSON не имеет функции поддержки «комментариев». Это может быть включено как дополнительный атрибут в одиночку.

  • YAML имеет некоторые преимущества перед JSON, такие как самостоятельная ссылка, поддержка сложных типов данных, встроенные литералы блоков, комментарии и многое другое.

  • JSON доступен только для чтения, тогда как YAML может быть как читаемым, так и редактируемым.
  • JSON является подмножеством YAML, так что парсеры YAML могут анализировать JSON.
  • YAML не использует никаких дополнительных разделителей, поэтому он более легкий, чем XML и JSON.
Premraj
источник
Что вы имеете в виду под «большими данными» и «только для чтения»? JSON - это формат данных, что может иметь абстрактное понятие с этими двумя ограничениями?
Жоао Фариас
4
@ JoãoFarias Допустим, у вас есть 1 ГБ JSON-файл и 1 ГБ CSV-файл, и у вас есть 256 МБ памяти. Вы можете обрабатывать CSV-файл построчно, с JSON это не так просто. Вероятно, анализировать файл YAML построчно проще, чем анализ JSON.
NeverEndingQueue