Перейти к основному содержимому

Различия между YAML и JSON

· 4 мин. чтения

1. Обзор

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

2. Формат

Чтобы получить лучшее изображение, давайте начнем с просмотра JSON и YAML-представлений простого POJO:

class Person {
String name;
Integer age;
List<String> hobbies;
Person manager;
}

Во-первых, давайте посмотрим на его представление JSON:

{
"name":"John Smith",
"age":26,
"hobbies":[
"sports",
"cooking"
],
"manager":{
"name":"Jon Doe",
"age":45,
"hobbies":[
"fishing"
],
"manager":null
}
}

Синтаксис JSON несколько громоздок, так как он использует специальный синтаксис, такой как фигурные скобки {} и квадратные скобки [] для представления объектов и массивов.

Далее посмотрим, как эта же структура будет выглядеть в YAML:

name: John Smith
age: 26
hobbies:
- sports
- cooking
manager:
name: Jon Doe
age: 45
hobbies:
- fishing
manager:

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

Мы видим, что, хотя оба легко читаемы, YAML имеет тенденцию быть более удобочитаемым для человека.

Еще одним бонусом для YAML является количество строк, необходимых для представления одной и той же информации: YAML занимает всего 11 строк, а JSON — 16.

3. Размер

В предыдущем разделе мы видели, что YAML представлен меньшим количеством строк, чем JSON, но означает ли это, что он занимает меньше места?

Давайте представим глубоко вложенную структуру с родителем и пятью дочерними элементами, представленными в виде JSON:

{
"child":{
"child":{
"child":{
"child":{
"child":{
"child":{
"child":null
}
}
}
}
}
}
}

Та же структура будет выглядеть аналогично в YAML:

child:
child:
child:
child:
child:
child:
child:

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

{"child":{"child":{"child":{"child":{"child":{"child":{"child":null}}}}}}}

Мы видим, что вторая форма намного короче и занимает всего 74 байта, тогда как формат YAML занимает 97 байт.

4. Возможности YAML

Помимо основных функций, которые предоставляет JSON, YAML обладает дополнительными функциями, как мы увидим далее.

4.1. Комментарии

YAML позволяет комментировать с помощью # , функция, которая часто требуется при работе с файлами JSON:

# This is a simple comment
name: John

4.2. Многострочные строки

Еще одна функция, отсутствующая в JSON, но присутствующая в YAML, — это многострочные строки :

website: |
line1
line2
line3

4.3. Псевдонимы и якоря

Мы можем легко присвоить псевдоним конкретному элементу с помощью & и привязать его (ссылку) с помощью * :

httpPort: 80
httpsPort: &httpsPort 443
defaultPort: *httpsPort

5. Производительность

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

Мы собираемся реализовать простой тест для сравнения скорости синтаксического анализа YAML и JSON с использованием JMH .

Для теста YAML мы собираемся использовать известную библиотеку змеи-yaml , а для нашего теста JSON мы будем использовать org-json :

@BenchmarkMode(Mode.Throughput)
@OutputTimeUnit(TimeUnit.SECONDS)
@Measurement(batchSize = 10_000, iterations = 5)
@Warmup(batchSize = 10_000, iterations = 5)
@State(Scope.Thread)
class Bench {

static void main(String[] args) {
org.openjdk.jmh.Main.main(args);
}

@State(Scope.Thread)
static class YamlState {
public Yaml yaml = new Yaml();
}

@Benchmark
Object benchmarkYaml(YamlState yamlState) {
return yamlState.yaml.load("foo: bar");
}

@Benchmark
Object benchmarkJson(Blackhole blackhole) {
return new JSONObject("{\"foo\": \"bar\"}");
}
}

Как и следовало ожидать, JSON оказался победителем, поскольку он примерно в 30 раз быстрее:

Benchmark             Mode  Cnt    Score   Error  Units
Main2.benchmarkJson thrpt 50 644.085 ± 9.962 ops/s
Main2.benchmarkYaml thrpt 50 20.351 ± 0.312 ops/s

6. Доступность библиотеки

JavaScript является стандартом для Интернета, а это означает, что почти невозможно найти язык, который не полностью поддерживает JSON.

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

7. Что мне выбрать?

На этот вопрос может быть сложно ответить, и во многих случаях он субъективен.

Если нам нужно предоставить набор REST API другим внешним или внутренним приложениям, нам, вероятно, следует использовать JSON, поскольку это де-факто отраслевой стандарт.

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

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

8. Заключение

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