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

Обработка JSON и XML


Описание.

Этот экшен нужен для работы с JSON и XML. Чаще всего эти форматы применяются в API различных сервисов. Например, сервисы по распознаванию капчи или СМС сервисы обычно работают с одним из этих форматов (либо сразу с двумя).

Одновременно в проекте может обрабатываться только один JSON или XML объект.

Если нужно обработать сразу несколько объектов, то сделать это можно только по очереди.

Что такое JSON?

JSON (JavaScript Object Notation). Простой и удобный для чтения формат обмена данными. Он позволяет хранить информацию в виде структурированного текста, который легко читается как компьютером, так и человеком.

Его основная особенность в том, что информация записывается в пары "ключ":значение. Ключ используется для названия данных, а в значения можно поместить строки, числа, массивы, логику и объекты.

Пример.

{
"имя": "Алексей",
"возраст": 28,
"город": "Москва",
"профессия": "Программист",
"опытРаботы": 5,
"владеетЯзыками": [
"Python",
"JavaScript",
"C++"
],
"удалённаяРабота": true,
"интересы": {
"спорт": "Футбол",
"музыка": "Рок",
"хобби": ["Фотография", "Путешествия", "Чтение"]
}
}

Что такое XML?

XML (eXtensible Markup Language) — это язык разметки, который используется для хранения и передачи данных. Главное отличие от JSON в том, что XML использует теги для обозначения данных, а JSON — пары ключ: значение.
В отличие от HTML, где есть фиксированные теги (например, <div>, <p>), в XML вы сами создаете теги, которые описывают данные.

Пример.

<CATALOG>
<CD>
<TITLE>Имперская Пародия</TITLE>
<ARTIST>Боб Дилан</ARTIST>
<COUNTRY>США</COUNTRY>
<COMPANY>Колумбия</COMPANY>
<PRICE>10.90</PRICE>
<YEAR>1985</YEAR>
</CD>
<CD>
<TITLE>Спрячь свое сердце</TITLE>
<ARTIST>Бонни Тайлер</ARTIST>
<COUNTRY>Соединенное Королевство</COUNTRY>
<COMPANY>Записи си-би-эс</COMPANY>
<PRICE>9.90</PRICE>
<YEAR>1988</YEAR>
</CD>
<CD>
<TITLE>Лучшие Хиты</TITLE>
<ARTIST>Долли Партон</ARTIST>
<COUNTRY>США</COUNTRY>
<COMPANY>Ар-Си-Эй</COMPANY>
<PRICE>9.90</PRICE>
<YEAR>1982</YEAR>
</CD>
</CATALOG>

Beautify.

Иногда сервисы возвращают не красиво отформатированный текст (как в примерах выше), а всё в одну строку. Это значительно затрудняет чтение. В таких случаях можно воспользоваться так называемыми улучшателями (beautifier). Например, в Тестере X/JSON Path уже встроен этот компонент — кнопка Beautify.

Beautify

Однако, для экшена не важно, как записан текст — красиво или в одну строку. Главное, чтобы он был корректно составлен.


Как добавить в проект?

Через контекстное меню: Добавить действие → Данные → Обработка JSON/XML.

Добавить в проект


Доступные действия.

Доступные действия


Парсинг.

Это действие нужно для обработки полученных данных.

Парсинг

Окно переменных.

Результат выполнения экшена заносится в переменную проекта Json или Xml. Содержимое можно посмотреть в Окне переменных. Так как ранее в примере мы парсили XML, то и выбираем соответствующую вкладку:

Окно переменных

В переменной Count (1) хранится количество элементов. Так что ее удобно использовать в качестве ограничителя при обходе данных в цикле.

Если бы в нашем примере ещё были тэги <DVD> на одном уровне с <CD>, то была бы переменная CATALOG.DVD.Count с количеством тэгов <DVD>:

CATALOG.DVD.Count

С помощью специальных кнопок (2) можно сразу скопировать макрос переменной в буфер обмена.

Макросы переменных.

Пример одного из макросов: {-Xml.CATALOG.CD[1].ARTIST-}.

Внутри этого макроса можно использовать другие переменные:

Макросы переменных

Быстрая вставка переменных.

Нажмите CTRL+ПРОБЕЛ в любом текстовом поле для вызова выпадающего меню. Далее двойной клик по JSON или XML для их выбора и поставьте ., тем самым открыв меню со спарсенными переменными.

Быстрая вставка переменных Быстрая вставка переменных

Обработать JsonPath/XPath.

Данная опция нужна для выделения подмножества из данных, которые спарсили. Чтобы она работала потребуется составить выражение XPath (для XML) или JsonPath (для JSON). С этим, опять же, поможет Тестер.

Обработать JsonPath/XPath

В поле для вставки выражения можно использовать макросы.


Особенности XML.

Особенности XML

У XML есть атрибуты узлов. Для доступа к ним нужно использовать в макросах квадратные скобки вместе со строковым значением: {-Xml.CATALOG.CD[0]["item"]-}.

атрибуты узлов

Скорость обработки.

Парсинг большого текста JSON или XML во время отладки проекта в ProjectMaker может занимать длительное время. Но зато при работе в ZennoDroid парсинг будет проходить гораздо быстрей.


Добавить в список.

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

Добавить в список
В переменной {-Variable.item_type-} находится CD

Свойство.

Тут мы указываем поле, которое будем разбирать как массив.

Есть возможность использования вложенности. Указывать параметры нужно через точку, например: store.employees.

Если поле не является массивом, то в список занесется только один элемент.

Подсвойство.

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


Добавить в таблицу.

Это действие похоже на предыдущее, но тут можно получить сразу несколько свойств. Также можно использовать переменные.

Добавить в таблицу
В переменной {-Variable.item_type-} находится CD, а в {-Variable.property-}ARTIST

Столбцы именуются, как и в Excel — большие латинские буквы в алфавитном порядке. Если пропустить один из столбцов, то он просто останется пустым. Как, например, столбец С на скриншоте:

столбец С


Работа с кодом.

В коде С# JSON и XML находятся в объекте project и имеют тип dynamic. Из-за этого редактор кода не может полноценно показывать выпадающие подсказки.

Пример 1.

project.Xml.FromString(project.Variables["XmlText"].Value);
return project.Xml.PurchaseOrder.Address[0]["Type"];

Пример 2.

var list = new List<string>();
for(int i = 0; i < project.Xml.PurchaseOrder.Address.Count; i++)
{
list.Add(project.Xml.PurchaseOrder.Address[i].Name.Value);
}
return string.Join(", ", list);

Пример 3.

var list = new List<string>();
foreach(dynamic i in project.Xml.PurchaseOrder.Address)
{
list.Add(i.Name.Value);
}
return string.Join(", ", list);

Аналогично происходит и с JSON. Однако стоит учесть, что доступ к свойствам происходит без использования Value.
Вот так: return project.Json.employees[1].firstName;


Пример с JSON.

Для тестирования возьмем сайт http://ip-api.com/, который использует простейший API для возврата подробной информации про ваш ip-адрес. В реальных сценариях это полезно:

  • Для проверки, что проект работает через прокси, а не через основной IP.
  • Для выбора страны/города при регистрации.

Этот сайт может возвращать данные в разных форматах. Но мы будем использовать именно JSON.

Пример с JSON

Для получения информации делаем GET-запрос по адресу http://ip-api.com/json, а затем обрабатываем результат через действие Парсить. После этого можно работать с полученными данными.

GET-запрос


Пример с XML и Обработка XPath.

Представим, что из всех данных нам нужны только названия альбомов. Тогда для этой задачи составим XPath выражение: //CATALOG/CD/TITLE.

Пример с XML
Настройки экшена и результат его работы (справа)