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