Что делать когда сервер возвращает JSON? Отпарсить его!
Diggernaut.com позволяет легко и просто, работать с форматом JSON конвертируя его в XML. И сейчас я вам это продемонстрирую.
Для примера я нашел один из публичных JSON RestAPI. Ссылка.
Вот пример ответа сервера.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
[ { "id": 1, "name": "Leanne Graham", "username": "Bret", "email": "Sincere@april.biz", "address": { "street": "Kulas Light", "suite": "Apt. 556", "city": "Gwenborough", "zipcode": "92998-3874", "geo": { "lat": "-37.3159", "lng": "81.1496" } }, "phone": "1-770-736-8031 x56442", "website": "hildegard.org", "company": { "name": "Romaguera-Crona", "catchPhrase": "Multi-layered client-server neural-net", "bs": "harness real-time e-markets" } }, ... ... ... ... ] |
Для начала создадим парсер (он же диггер), переведем его в дебаг режим, и установим имя браузера как Firefox.
1 2 3 4 5 |
--- config: debug: 2 agent: Firefox |
Добавим блок do и запишем в него команду walk с адресом тестового RestAPI сервиса. Так же я покажу вам маленький трюк, который будет очень полезен в дальнейшем. Суть трюка в том что бы остановить выполнение в какой то нужный нам момент. Для этого добавим в блок do команду stop.
1 2 3 4 5 6 7 8 9 10 |
--- config: debug: 2 agent: Firefox do: - walk: to: http://jsonplaceholder.typicode.com/users do: - stop |
Запустим парсер, и дождемся окончания его работы. Как и ожидалось, парсер закончил работу с ошибкой.
Перейдем в лог диггера и посмотрим почему это произошло.
Unsupported operator used: stop
Такая команда не поддерживается системой, это приводит к ошибке, и как следствие к прекращению работы диггера, так как диггер находится в дебаг режиме и количество ошибок не может быть больше 1.
Теперь посмотрим как ответ сервера был обработан диггером.
А так он будет выглядеть в текстовом редакторе.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
<html> <head></head> <body> <body_safe> <element> <address> <city>Gwenborough</city> <geo> <lat>-37.3159</lat> <lng>81.1496</lng> </geo> <street>Kulas Light</street> <suite>Apt. 556</suite> <zipcode>92998-3874</zipcode> </address> <company> <bs>harness real-time e-markets</bs> <catchphrase>Multi-layered client-server neural-net</catchphrase> <name>Romaguera-Crona</name> </company> <email>Sincere@april.biz</email> <id>1</id> <name>Leanne Graham</name> <phone>1-770-736-8031 x56442</phone> <username>Bret</username> <website>hildegard.org</website> </element> <element> <address> <city>Wisokyburgh</city> <geo> <lat>-43.9509</lat> <lng>-34.4618</lng> </geo> <street>Victor Plains</street> <suite>Suite 879</suite> <zipcode>90566-7771</zipcode> </address> <company> <bs>synergize scalable supply-chains</bs> <catchphrase>Proactive didactic contingency</catchphrase> <name>Deckow-Crist</name> </company> <email>Shanna@melissa.tv</email> <id>2</id> <name>Ervin Howell</name> <phone>010-692-6593 x09125</phone> <username>Antonette</username> <website>anastasia.net</website> </element> ... ... ... ... ... ... ... ... ... </body_safe> </body> </html> |
Удалим команду stop и зайдем в каждый тег
Сам процесс сбора данных не отличается от работы с HTML, поэтому я опишу его очень кратко — ввиде коментариев в коде.
Комментарии отмечены знаком #.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 |
--- config: debug: 2 agent: Firefox do: - walk: to: http://jsonplaceholder.typicode.com/users do: #Создадим обьект для хранения всех наших данных - object_new: APIService #Перейдем в тег <element> - find: path: element do: # Создадим обьект для хранения данных с каждой итерации по тегу <element> - object_new: user # Собираем данные # Мы не будем забирать все данные, а только их часть - find: path: id do: - parse # Записываем поле id в обьект user(далее почти все операции сводятся к этому,в важных местах будут комментарии) - object_field_set: object: user field: id - find: path: name do: - parse - object_field_set: object: user field: name - find: path: username do: - parse - object_field_set: object: user field: username # Сделаем из адреса одну строку - find: path: address do: - find: path: street do: - parse - object_field_set: object: user field: address - find: path: suite do: - parse - object_field_set: object: user field: address joinby: ", " - find: path: city do: - parse - object_field_set: object: user field: address joinby: ", " - find: path: zipcode do: - parse - object_field_set: object: user field: address joinby: ", " # Запишем обьект user в обьект APIService - object_save: name: user to: APIService # Запишем главный обьект - object_save: name: APIService |
На этом построение конфига окончено, диггер можно перевести в активный режим и запустить.
По окончанию работы стоит выгрузить данные и проверить все ли у нас получилось.
Перейдем в раздел с данными и скачаем их в нужном нам формате, мой пример демонстрирует JSON.
В текстовом редакторе данные будут выглядеть вот так:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
{ "data": [{ "user": [{ "username": "Bret", "id": "1", "name": "Leanne Graham", "address": "Kulas Light, Apt. 556, Gwenborough, 92998-3874" }, ... ... ... { "username": "Moriah.Stanton", "address": "Kattie Turnpike, Suite 198, Lebsackbury, 31428-2261", "id": "10", "name": "Clementina DuBuque" }] }], "session": "session_595", "digger": "digger_120" } |
На этом все, если у вас остались вопросы, пишите их в коментариях, я обязательно отвечу.