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

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

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

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

Связанный:

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

Ответ 1

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

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

В общем, есть некоторые вещи, которые мне нравятся в YAML, которые недоступны в JSON.

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

В настоящее время AJAX и другие веб-технологии имеют тенденцию использовать JSON. В настоящее время YAML используется больше для автономных процессов обработки данных. Например, он по умолчанию включен в C-based OpenCV computer vision package, тогда как JSON - нет.

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

Ответ 2

Отличия:

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

Ответ 3

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

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

  • YAML использует отступы в виде пробелов, которые знакомы для разработчиков Python.
  • Разработчики JavaScript любят JSON, потому что это подмножество JavaScript и могут быть непосредственно интерпретированы и записаны внутри JavaScript, а также использовать сокращенный способ объявить JSON, не требуя двойных кавычек в ключах при использовании типичных имен переменных без пробелов.
  • Существует множество парсеров, которые отлично работают на всех языках для YAML и JSON.
  • Формат пробелов YAML во многих случаях может быть намного проще, потому что для форматирования требуется более понятный для человека подход.
  • Простые пробелы YAML, будучи более компактными и удобными для просмотра, могут быть обманчиво трудными для редактирования вручную, если в вашем редакторе нет индикаторов пробелов или указателей строки.
  • JSON намного быстрее выполняет сериализацию и десериализацию из-за значительно меньшего количества функций, чем YAML для проверки, что позволяет обрабатывать JSON с меньшим и более легким кодом.
  • Общепринятое заблуждение заключается в том, что YAML требует меньше знаков препинания и более компактна, чем JSON, но это полностью ложно. Пробел невидим, поэтому кажется, что символов меньше, но если вы считаете фактические пробелы, необходимые для правильной интерпретации YAML вместе с правильным отступом, вы обнаружите, что YAML на самом деле требует больше символов, чем JSON. JSON не использует пробелы для представления иерархии или группировки и может быть легко сплющена ненужными пробелами для более компактного транспорта.

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

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

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

Ответ 4

Этому вопросу 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 - более разумный компромисс с четко определенным синтаксисом.

Ответ 5

GIT и YAML

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

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

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

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

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

Ответ 6

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

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

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

Ответ 7

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

Ответ 8

Технически YAML предлагает гораздо больше, чем JSON (YAML v1.2 является надмножеством JSON)

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

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

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

Какой из них выбрать?

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

Ответ 9

Поскольку этот вопрос теперь занимает видное место при поиске YAML и JSON, стоит отметить одно редко упоминаемое различие между двумя: лицензия. JSON хочет иметь license, которые должны придерживаться пользователи JSON (в том числе юридически неоднозначные) для Good, а не Evil")., YAML не несет такого требования к лицензии, и это может быть важным отличием (для вашего адвоката, если не для вас).

Ответ 10

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

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

type Person struct {
    Name string `json:"name" yaml:"name"`
    Age int `json:"age" yaml:"age"`
}

Ответ 11

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

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

Ответ 13

  • JSON не может обрабатывать большие данные.

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

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

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

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

Ответ 14

От: Arnaud Lauret Book 'Разработка веб-API.' :

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

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

enter image description here

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

YAML

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

enter image description here

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

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

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

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

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