JSON. Вы человек или машина?

Kate

Administrator
Команда форума
JSON, YAML, XML
Недавно я переехал в Москву в квартиру без письменного стола.
Это было неловким, отягчающим непростую ситуацию обстоятельством: спального места тоже не было. В общем, я позвонил в IKEA и попросил привезти мне и то и другое.
Через пару дней мебель доставили. Я распаковал первую коробку, из нее вывалилась инструкция и у меня опустились руки: в ней наверняка должно быть пятьдесят разных языков, все мелким шрифтом, как книга заклинаний из Гарри Поттера. Но приглянувшись я увидел, что в ней были только рисунки, а именно: два смешных чувачочка показывали, как обращаться с деталями, как их вертеть, собирать и так далее. Уф, счастье! Я подумал о JSON и XML. IKEA молодцы они использовали универсальный язык жестов и картинов, понятный всем на свете.
Если я напишу какой-то код в JAVA и если мне взбредет в голову обменяться этим кодом с другим приложением, которое написано на Python, то, скорей всего, ничего не получится. Это все равно что подсунуть японцу инструкцию по сборке письменного стола на монгольском языке. Для этой точки коммуникации мне нужно найти общий язык или data serialization language, таких красавцев как JSON или XML, например.
XML (Extensible Markup Language) в основном используется в сайтах и он пытается быть удобным для восприятия человеком. Я сказал “пытается” потому что он делает это хорошо, но не отлично. Его название включает понятие markup (разметка), потому что в коде он включает дополнительные детали как форматировать текст, шрифт, его цвет и размер.
e23938136329bce85c5385e8530bf818.png

Другое дело JSON (JavaScriptObject Notation). Как и указано в названии, он в основном используется с JavaScript. Но мы часто видим его в мире автоматизации сети, в частности в APIs. Причина почему именно он в APIs, а не XML, потому что он более понятен для нас. Мы можем читать его как стихотворение.
5b086eead6d0c7fcba34cd9af00cee40.png

Оппозиционер XML это YAML, он не использует разметку (markup) и это делает его более простым. Он фаворит среди языков-сценариев, таких как Python и Perl. Мы часто используем его в Ansible. Ansible это популярный инструмент автоматизации сети. Некоторые ради шутки называют его Yansible. И он безумно-безумно удобен для восприятия человеком.
1a0013de8d5e45ed1b9fe6b6c10102bc.png

Интерпретация JSON
fbaf2ca83ea979dbc5e0e6ef3129100d.png

Вы человек или машина? Причина, по которой мы натыкаемся на эти ловушки в том, что машины не умеют распознавать неформатированные данные. Если данные не понятны, машина не сможет их распознать и интерпретировать, доказав, что она не человек.
Мы, люди, можем легко читать данные как на этой картинке. Например, если мы введем команду display version на коммутаторе серии CE, то он может немного отличаться от вывода такой же команды на роутере серии NE и для нас в этом не будет особой проблемы:
8bae78668efa21daa2dbb8e85c460948.png
9be73073e461877cf056368d89def2ac.png

Для нас людей такая разница не существенна, потому что она все равно понятна для нас, но для машин даже незначительная разница может стать критической для обработки. Например, если я подключаюсь к коммутатору через SSH используя Python и отправляю команду display version или display ip int brief, но при этом не буду использовать JSON формат данных, или любой другой формат, как XML или YAML, то, во-первых, будет сложно написать код, чтобы он был верно интерпретирован машиной, во-вторых, разобраться с ситуацией, когда вывод изменится. Для примера, если вы обновите ваш роутер и вывод конфигурации будет изменен, то ваш Python-код вряд ли сможет быть применен. Для машина-машина коммуникации важно, чтобы вывод был стандартизирован. В некоторых особенно продвинутых (на мой взгляд) компаниях при устройстве на работу могут попросить представить рассказ о себе в виде JSON.
Мы тут не будет рассказывать о себе, вместо этого попробуем рассказать о Живописном Мосте в Москве:
ad30728a070d510e9d7fc7b54aa3c260.png

Зададимся типовыми вопросами, например:
Кто конструктор моста?
Конструктор: Шумаков.Н.И
Какой тип конструкции этого моста?
Конструкция: Вантово-балочной с арочным пилоном
Обратите внимание как я записал эту информацию жирным шрифтом! Первое значение известно как “ключ” (key), второе - “значение” (value). Между ними двоеточие (colon).
Какова высота моста?
Высота: 105м
Из чего сделан мост?
Материал: железобетон
Какова дата открытия моста?
Открытие: 27 декабря 2007 года
Я просто взял эту информацию из Википедии. Надеюсь, она верна. Главное здесь не информация, главное - формат. Каждая пара состоит из key и value, при этом key отделен от value с помощью двоеточия. В мире компьютеров подобная информация будет выглядеть так:
“height”: “105m”
Каждое значение помещается в двойные кавычки.
Есть два вида данных в JSON формате: objects и arrays.
Вот пример объекта:
{“height”: “105m”, “color”: “red”}
Вот что свойственно объектам:
Группы пар key:value не требуют упорядоченности. То есть их порядок не имеет значения, он может быть любым.
Данные замыкаются в изогнутные скобки {} curly braces
Key и value отделяются друг от друга с помощью двоетония : a colon
Каждая пара key:value отделяется друг от друга запятой , a comma (кроме последней пары!)
Используеются только двойные кавычки, не единичные () double quotes
Взглянем на другой пример в более удобной форме:
Объект (object)
{
“height” : “105m”,
“color” : “red”
}

После последней пары не должно стоять запятой:
5f3d4418d735572a6d14050c2f43ed7d.png

Если поставить там запятую, то будет проблема.
Давайте я покажу вам на реальном примере с помощью Ansible. Я отправлю запрос на коммутатор CloudEngine6800 из playbook файла команду display int GE1/0/1:
479ba199c59d4928308bc36925ee5e61.png

При этом к стартовой команде добавлю значение -vvv, чтобы увидеть логи запроса и вывод команды. Вывод будет в формате JSON:
ansible-playbook -vvv display_int_1.yml
Первое, что мы увидим - это лог успешного применения запроса:
4ee47806f0aa3f33f2a66d51d48d97d0.png

Где здесь объект? Вот объект:
7f9cd1225adc6a99752397169e898b66.png

При этом внутри этого объекта есть другой объект, вот он:
00609bd4b99ac108e88d4ae010c9e20b.png

Где здесь key и value? Вот они:
3e4d0881f5ded2d80636e55a67a6fd43.png

За последней парой нет запятой!
Причина, по которой одни value находятся в двойных кавычках, а другие нет в том, что если числовое значение value поместить в кавычки, то оно перестанет быть числовым значением, а станет строковым значением. Null - значит пустое значение. В данном примере только числовые значения не находятся в кавычках.
Здесь также есть квадратные скобки (square brackets):
0c4667d9f8397e1e9696fd3cb9c0a3c8.png

Они здесь указывают на существование второго вида данных arrays.
Array используется для того, чтобы упорядочить список value.
Например, если мы добавим вторую команду в список заданий в файле playbook, например display version:
1b43e60f1fab053b65195b3003440a7f.png

И запустим команду снова, то увидим, что вывод каждой из команд будет замкнут в квадратные скобки:
3fcce48f8ef5e60aaffea4a3e149c2c5.png

Здесь мы имеем несколько команд и вывод нескольких команд, и квадратные скобки как синтаксическую единицу, чтобы отделить одно от другого в рамках одного объекта - commands.
Array может содержать широкий перечень типов данных JSON, такие как строка (string), в нашем примере это "Huawei Versatile Routing Platform Software", а также числа, другой объект, пустое значени (null) или другой array.
Итак, еще раз. Все что находится внутри { }curly braces - это JSON object. Это почти то же самое, что словарь в Python - dictionary:
08a17c09309c635fefd0f7d3a640dff1.png

Другой игрок - array. Он замыкает группу данных в квадратных скобках [ ] square brackets. Это очень похоже на list:
fea179b48249827ff8de4e41a753ec30.png

Если вы назовете array листом или object словарем - не краснейте, люди делают это постоянно. Это взаимозаменяемые определения.
Записать перечень имен получится так:
9272f8c333c3d21e93f06c7b0e3badf2.png

Взглянем с помощью Postman на реальные данные от роутера, а именно его интерфейсы. Полученные данный вставим в Visual Studio Code:
bbcd220c983a88fefd068fdccec0f0f1.png

Первое, на что мы должны обратить тут внимание это открытый { curly braces и следом за ним первую пару key: value. Key всегда выделяется двойными кавычками!
1e6c1ff3657220a6ddf7f756b250200b.png

Дальше мы видим открытую квадратную скобку, следом за которой сразу изогнутая скобка. Это значит, что value здесь - это лист JSON объектов:
3b52825d2f8591bd1fdce5bf87f42662.png

Опустимся ниже, посмотрим сколько всего у нас объектов… Мы уже видим, что у нас есть loopback 4 и loopback 5, и это два объекта. Далее у нас есть GigabitEthernet1:
5c449909dcb52bd29639445cf7a55960.png

И loopback 2 и loopback 3. Итого 5 интерфейсов. Обратите внимание, что каждый объект отделен от другого запятой:
7ec5187d6e19044a8c043f369d8d0bee.png

Мы понимаем, что loopback 5 это последний интерфейс, потому что после закрывающей изогнутой скобки нет запятой. И мы также понимаем что это конец и для array или листа, потому что у нас есть закрывающая квадратная скобка:
fdf8f6dbf789a1f03f840121fc4d44fa.png

После следует еще одна пара key:value, который закрывает этот большой объект. Здесь нет запятой, но есть закрывающая изогнутая скобка на конечной линии:
d9de1f6767a940c7370faa4ce06bbe4a.png

Прелесть Visual Studio code в том, что он позволяет свернуть объекты внутри объекта.
Мы можем нажать на эту стрелочку вверху...
0239d9ea378aa756970cb271fb8b5fea.png

И Voila! У нас теперь всего один большой объект:
1d18fbe16ef8f88c5cb8ba8c9b42b729.png

В этом большом объекте есть только две пары key:value. Первая пара: items + array, вторая - kind + collections#interface
То, что мы увидели - это красивый или pretty JSON. Вот как на этой схеме ниже: тут есть и пустые поля и отступы, все, что нужно для лучшего понимания.
88b4a662fe4174c442d4774cb4ee1c29.png

Чаще всего JSON предстает в другом виде. Например, если в Python мы попросим вывести нам аналогичный файл с перечнем интерфейсов, то увидим примерно следующее:
e1a7af6439c16ff39b48ffa60c418c21.png

Недавно я сдавал экзамен ENCOR 350-401 и мне попалось пара вопросов, где требовалось разобрать такой JSON output, и это было очень непросто.
Чтобы в Python увидеть pretty JSON, нужно ввести команду pretty print (pprint):
59c7c7ae210c8af78a21ebd864152f24.png

И вот совсем другой результат, именно так, как мы и хотим видеть JSON:
33fd3a0f160bf549fcdf11d966248ad9.png

Вы можете узнать немного больше об Ansible и его применении на коммутаторах CloudEngine от Huawei, в статьях: "Немного пинг-понга на Windows с Ansible. Автоматизируем нашу сеть прямо сейчас!” и "Пинг-понг с Ansible на CloudEngine коммутаторах"


Источник статьи: https://habr.com/ru/company/huawei/blog/556792/
 
Сверху