«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. Псевдонимы и привязки

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

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