В чем разница между YAML и JSON? Когда предпочесть одно другому - PullRequest
611 голосов
/ 13 ноября 2009

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

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

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

Связанный:

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

Ответы [ 12 ]

574 голосов
/ 13 ноября 2009

Технически 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 .

166 голосов
/ 07 июня 2013

Отличия:

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

Замечания:

  1. Программисты Python, как правило, являются большими поклонниками YAML из-за использования отступов, а не синтаксиса в квадратных скобках, для указания уровней.
  2. Многие программисты считают привязанность «значения» к отступу плохим выбором.
  3. Если формат данных выходит из среды приложения, анализируется в пользовательском интерфейсе или отправляется на уровне обмена сообщениями, JSON может быть лучшим выбором.
  4. YAML может использоваться непосредственно для сложных задач, таких как определения грамматики, и часто является лучшим выбором, чем изобретение нового языка.
77 голосов
/ 23 января 2016

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

Это отвечает названию, а не деталям, так как большинство просто читает заголовок из результатов поиска на 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 в этом случае.

31 голосов
/ 12 апреля 2016

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

Скорость

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

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

Память

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

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

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

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

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

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

Резюме

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

22 голосов
/ 13 ноября 2009

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

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

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

19 голосов
/ 13 ноября 2009

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

17 голосов
/ 23 марта 2018

GIT и YAML

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

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

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

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

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

11 голосов
/ 03 марта 2016

Технически 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 ограниченные возможности, широкая поддержка и более быстрый анализ делают его отличным выбором для взаимодействия и пользовательских данных .
3 голосов
/ 29 марта 2017

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

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

type Person struct {
    Name string `json:"name" yaml:"name"`
    Age int `json:"age" yaml:"age"`
}
3 голосов
/ 20 сентября 2016

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...