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

1. Общ преглед

В тази бърза статия ще разгледаме разликите между YAML и JSON чрез бързи и практически примери.

2. Форматиране

За да имаме по-добро изображение, нека започнем с разглеждането на JSON и YAML представленията на прост POJO:

class Person { String name; Integer age; List 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 ще използваме добре познатата библиотека snake-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 и кои аспекти да вземем предвид, за да вземем информирано решение кой да изберем.