В чем разница между YAML и JSON? Когда предпочесть одно другому
Когда нам следует использовать YAML вместо JSON и наоборот, учитывая следующие вещи?
- Производительность (время кодирования / декодирования)
- Потребление памяти
- Ясность выражения
- Доступность библиотеки, простота использования (я предпочитаю C)
Я планировал использовать один из этих двух компонентов в нашей встроенной системе для хранения файлов конфигурации.
Связанные с:
Должен ли я использовать YAML или JSON для хранения данных Perl?
18 ответов
Технически 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.
Отличия:
- YAML, в зависимости от того, как вы его используете, может быть более читабельным, чем JSON
- JSON часто быстрее и, вероятно, все еще совместим с большим количеством систем
- Можно очень быстро написать "достаточно хороший" анализатор JSON
- Дублирующиеся ключи, которые являются потенциально допустимыми JSON, определенно являются недействительными YAML.
- YAML обладает множеством функций, включая комментарии и реляционные привязки. Синтаксис YAML, соответственно, довольно сложный и может быть сложным для понимания.
- Можно написать рекурсивные структуры в yaml:
{a: &b [*b]}
, который будет бесконечно зацикливаться в некоторых конвертерах. Даже при круговом обнаружении "бомба ямла" все еще возможна (см. Бомбу XML). - Поскольку нет ссылок, невозможно сериализовать сложные структуры со ссылками на объекты в JSON. Поэтому сериализация YAML может быть более эффективной.
- В некоторых средах кодирования использование YAML может позволить злоумышленнику выполнить произвольный код.
Замечания:
- Программисты Python, как правило, являются большими поклонниками YAML из-за использования отступов, а не синтаксиса в квадратных скобках, для указания уровней.
- Многие программисты считают, что привязанность значения к отступу является плохим выбором.
- Если формат данных выходит из среды приложения, анализируется в пользовательском интерфейсе или отправляется на уровне обмена сообщениями, JSON может быть лучшим выбором.
- YAML может использоваться непосредственно для сложных задач, таких как определения грамматики, и часто является лучшим выбором, чем изобретение нового языка.
В обход эзотерической теории
Это отвечает названию, а не деталям, так как большинство просто читает заголовок из результатов поиска на 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 в этом случае.
Этому вопросу 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 - более разумный компромисс с четко определенным синтаксисом.
GIT и YAML
Другие ответы хороши. Прочитайте те сначала. Но я добавлю еще одну причину использовать YAML: git.
Все больше и больше программных проектов используют репозитории git для распространения и архивирования. И хотя история репозитория git может в равной степени хранить файлы JSON и YAML, метод diff, используемый для отслеживания и отображения изменений в файле, ориентирован на строки. Поскольку YAML вынужден ориентироваться на строки, любые небольшие изменения в файле YAML легче увидеть человеку.
Конечно, это правда, что файлы JSON можно "сделать красивыми", отсортировав строки / ключи и добавив отступы. Но это не по умолчанию, и я ленивый.
Лично я обычно использую JSON для взаимодействия системы. Я часто использую YAML для файлов конфигурации, статических файлов и отслеживаемых файлов. (Я также обычно избегаю добавления реляционных якорей YAML. Жизнь слишком коротка, чтобы выслеживать циклы.)
Кроме того, если скорость и пространство действительно важны, я тоже не использую. Вы можете посмотреть на BSON.
Я считаю, что YAML проще для глаз: меньше скобок, "" и т. Д. Хотя в YAML есть раздражение от вкладок... но это можно понять.
С точки зрения производительности / ресурсов, я не ожидал бы больших различий между ними.
Кроме того, мы говорим о файлах конфигурации, и поэтому я не ожидаю высокой частоты кодирования / декодирования, не так ли?
Технически 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, широкая поддержка и более быстрый анализ делают его отличным выбором для обеспечения взаимодействия и предоставления данных пользователем.
Если вам не нужны какие-либо функции, которые есть у YAML, а у JSON нет, я бы предпочел JSON, потому что он очень прост и широко поддерживается (имеет много библиотек на многих языках). YAML более сложный и имеет меньшую поддержку. Я не думаю, что скорость синтаксического анализа или использование памяти будут сильно отличаться, и, возможно, не большая часть производительности вашей программы.
Результаты тестов
Ниже приведены результаты теста для сравнения времени загрузки YAML и JSON на Python и Perl.
JSON намного быстрее за счет некоторой читабельности и таких функций, как комментарии
Метод испытания
- 100 последовательных запусков на быстрой машине, среднее количество секунд
- Набор данных представлял собой JSON-файл размером 3,44 МБ, содержащий данные о фильмах, извлеченные из Википедии https://raw.githubusercontent.com/prust/wikipedia-movie-data/master/movies.json.
- Связано с: https://github.com/jdorfman/awesome-json-datasets
Полученные результаты
Python 3.8.3 timeit
JSON: 0.108
YAML CLoader: 3.684
YAML: 29.763
Perl 5.26.2-043 Benchmark::cmpthese
JSON XS: 0.107
YAML XS: 0.574
YAML Syck: 1.050
Perl 5.26.2-043 Dumbbench (Brian D Foy, excludes outliers)
JSON XS: 0.102
YAML XS: 0.514
YAML Syck: 1.027
Из: Книга Арно Лора "Дизайн веб-API".:
Формат данных JSON
JSON - это текстовый формат данных, основанный на том, как язык программирования JavaScript описывает данные, но, несмотря на свое название, он полностью не зависит от языка (см. https://www.json.org/). Используя JSON, вы можете описывать объекты, содержащие неупорядоченные пары имя / значение, а также массивы или списки, содержащие упорядоченные значения, как показано на этом рисунке.
Объект отделяется фигурными скобками ({}). Имя представляет собой строку в кавычках ("имя"), отделенную от своего значения двоеточием (:). Значение может быть строкой типа "значение", числом, например 1,23, логическим значением (истина или ложь), нулевым значением null, объектом или массивом. Массив разделяется скобками ([]), а его значения разделяются запятыми (,). ФорматJSON легко анализируется с использованием любого языка программирования. Его также относительно легко читать и писать. Он широко применяется для многих целей, таких как базы данных, файлы конфигурации и, конечно же, API.
YAML
YAML(YAML Ain't Markup Language) - это удобный для человека формат сериализации данных. Как и JSON, YAML ( http://yaml.org/) - это формат данных типа "ключ-значение". На рисунке показано сравнение этих двух.
Обратите внимание на следующие моменты:
ВYAML нет двойных кавычек ("") вокруг имен свойств и значений.
Структурные фигурные скобки ({}) и запятые (,)JSON заменяются в YAML символами новой строки и отступом.
Скобки массива ([]) и запятые (,) заменяются дефисами (-) и новой строкой вYAML.
В отличие от JSON, YAML допускает комментарии, начинающиеся с решетки (#). Преобразовать один из этих форматов в другой относительно легко. Однако будьте осторожны, вы потеряете комментарии при преобразовании документа YAML в JSON.
Поскольку этот вопрос теперь занимает заметное место при поиске YAML и JSON, стоит отметить одно редко цитируемое различие между ними: лицензия. JSON претендует на то, чтобы иметь лицензию, которой должны придерживаться пользователи JSON (включая юридически неоднозначное "должно использоваться для Добра, а не Зла"). YAML не имеет такой лицензии, и это может быть важным отличием (для вашего адвоката, если не для вас).
Иногда вам не нужно выбирать одно за другим.
В Go, например, вы можете иметь оба одновременно:
type Person struct {
Name string `json:"name" yaml:"name"`
Age int `json:"age" yaml:"age"`
}
Я считаю, что YAML и JSON очень эффективны. Единственные две вещи, которые действительно диктуют, когда одна используется поверх другой для меня, это одна, с которой язык используется наиболее популярно. Например, если я использую Java, Javascript, я буду использовать JSON. Для Java я буду использовать их собственные объекты, которые в значительной степени являются JSON, но в них отсутствуют некоторые функции, и преобразовать их в JSON, если мне нужно, или сделать это в JSON. Я делаю это, потому что это обычное явление в Java и облегчает другим разработчикам Java модификацию моего кода. Во-вторых, использую ли я это для программы, чтобы запомнить атрибуты, или если программа получает инструкции в виде файла конфигурации, в этом случае я буду использовать YAML, потому что он очень легко читается человеком, имеет хороший выглядит синтаксис, и его очень легко изменить, даже если вы не знаете, как работает YAML. Затем программа прочитает его и преобразует в формат JSON или любой другой формат, предпочтительный для этого языка.
В конце концов, это, честно говоря, не имеет значения. И JSON, и YAML легко читаются любым опытным программистом.
Если вас беспокоит более высокая скорость синтаксического анализа, то можно сохранить данные в JSON. Мне пришлось проанализировать данные из того места, где файл мог быть изменен другими пользователями, и поэтому я использовал YAML, поскольку он обеспечивает лучшую читаемость по сравнению с JSON. И вы также можете добавлять комментарии в файл YAML, чего нельзя сделать в файле JSON.
Разработчик Javascript, например JSON, и разработчик Python предпочитают YMAL.
Мир программирования и, что более важно, Интернет сильно изменился с 2009 года. Я сам предпочитаю JSON, а не YAML, потому что я разработчик JavaScript, как внешнего, так и внутреннего интерфейса с Node.js, но многие аргументы против JSON недействительны с npm пакет hjson.
YAML намного компактнее и лаконичнее, чем JSON, но библиотека с открытым исходным кодом hjson предоставляет лучшее из обоих миров на многих языках с чистой читабельностью YAML, но ясностью и структурой JSON.
Вот пример JSON, YAML и hjson, которые представляют одни и те же данные, чтобы продемонстрировать это:
JSON
{
"first_name": "John",
"last_name": "Smith",
"age": 25,
"address": {
"street_address": "21 2nd Street",
"city": "New York",
"state": "NY",
"postal_code": "10021"
},
"phone_numbers": [
{
"type": "home",
"number": "212 555-1234"
},
{
"type": "fax",
"number": "646 555-4567"
}
],
"sex": {
"type": "male"
}
}
YAML
first_name: John
last_name: Smith
age: 25
address:
street_address: 21 2nd Street
city: New York
state: NY
postal code: '10021'
phone_numbers:
- type: home
number: 212 555-1234
- type: fax
number: 646 555-4567
sex:
type: male
hjson
{
first_name: John
last_name: Smith
age: 25
address: {
street_address: 21 2nd Street
city: New York
state: NY
postal_code: 10021
}
phone_numbers: [
{
type: home
number: 212 555-1234
}
{
type: fax
number: 646 555-4567
}
]
sex: {
type: male
}
}
Примеры данных из Википедии
Комментарии разрешены как в YAML, так и в hjson, и потенциально могут использоваться в JSON с использованием зарезервированного ключевого поля, то есть:
JSON:
{
"_comment": "comment",
"key": "field"
}
YAML:
# comment
key: field
hjson:
{
# comment
// comment
/*
comment
*/
key: field
}
hjson предоставляет больше возможностей для стилей комментариев, включая поддержку многострочных комментариев.
hjson также поддерживает многострочные строки с сохранением табуляции:
{
multilineString:
'''
Multiline string
tabs preserved
Cool!
'''
}
JSON является наиболее доступным, поскольку он встроен в JavaScript и прост в использовании в Интернете, но hjson можно легко установить в проект Node.js с помощью всего:
npm install hjson
, заменяя
.json
расширения файлов с
.hjson
и установка расширения hjson для VS Code.
Вы также можете попробовать онлайн-площадку hjson, конвертируя между hjson и JSON.
JSON не может обрабатывать большие данные.
Не подходит для обработки различных мультимедийных форматов.
JSON не имеет функции поддержки "комментариев". Это может быть включено как дополнительный атрибут в одиночку.
YAML имеет некоторые преимущества перед JSON, такие как самостоятельная ссылка, поддержка сложных типов данных, встроенные литералы блоков, комментарии и многое другое.
- JSON доступен только для чтения, тогда как YAML может быть как читаемым, так и редактируемым.
- JSON является подмножеством YAML, так что парсеры YAML могут анализировать JSON.
- YAML не использует никаких дополнительных разделителей. Так что это легче, чем XML и JSON.
JSON кодирует шесть типов данных: объекты (сопоставления), массивы, строки, числа, логические значения и нуль. Для машины чрезвычайно легко анализировать и обеспечивает очень небольшую гибкость. Спецификация занимает примерно полторы страницы.
YAML позволяет кодировать произвольные данные Python и прочую бредовую хрень (что приводит к уязвимостям при их декодировании). Его трудно разобрать, потому что он предлагает большую гибкость. Спецификация для YAML составляла 86 страниц, когда я последний раз проверял. Синтаксис YAML, очевидно, находится под влиянием Python, но, возможно, на них должна была повлиять философия Python по нескольким пунктам: например, «должен быть один — и желательно только один — очевидный способ сделать это» и «простой — лучше». чем сложные».
Основное преимущество YAML по сравнению с JSON заключается в том, что его легче читать и редактировать людям, что делает его естественным выбором для файлов конфигурации.
В настоящее время я склоняюсь к TOML для файлов конфигурации. Он не такой красивый и гибкий, как YAML, но его легче анализировать как машинам, так и людям. Синтаксис является (почти) надмножеством синтаксиса INI, но он анализирует структуры данных, подобные JSON, добавляя только один дополнительный тип: тип даты.