Что делать когда сервер возвращает JSON? Отпарсить его!

Diggernaut позволяет легко и просто, работать с форматом JSON конвертируя его в XML. И сейчас я вам это продемонстрирую.

Для примера я нашел один из публичных JSON RestAPI.

Вот пример ответа сервера.

[
  {
    "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.

---
config:
    debug: 2
        agent: Firefox

Добавим блок do и запишем в него команду walk с адресом тестового RestAPI сервиса. Так же я покажу вам маленький трюк, который будет очень полезен в дальнейшем. Суть трюка в том что бы остановить выполнение в какой то нужный нам момент. Для этого добавим в блок do команду stop.

---
config:
    debug: 2
    agent: Firefox
do:
- walk:
    to: http://jsonplaceholder.typicode.com/users
    do: 
        - stop

Запустим парсер, и дождемся окончания его работы. Как и ожидалось, парсер закончил работу с ошибкой.

Перейдем в лог диггера и посмотрим почему это произошло.

Unsupported operator used: stop

Такая команда не поддерживается системой, это приводит к ошибке, и как следствие к прекращению работы диггера, так как диггер находится в дебаг режиме и количество ошибок не может быть больше 1.

Теперь посмотрим как ответ сервера был обработан диггером.

А так он будет выглядеть в текстовом редакторе.

<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 и зайдем в каждый тег element, что бы собрать с него данные. Все просто.
Сам процесс сбора данных не отличается от работы с HTML, поэтому я опишу его очень кратко — ввиде коментариев в коде.
Комментарии отмечены знаком #.

---
config:
    debug: 2
    agent: Firefox
do:
- walk:
    to: http://jsonplaceholder.typicode.com/users
    do: 
    #Создадим обьект для хранения всех наших данных
    - object_new: APIService
    #Перейдем в тег 
    - find:
        path: element
        do:
        # Создадим обьект для хранения данных с каждой итерации по тегу  
        - 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.

В текстовом редакторе данные будут выглядеть вот так:

{
    "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"
}

На этом все, если у вас остались вопросы, пишите их в коментариях, я обязательно отвечу.

Евгений Соломанидин:
Related Post

This website uses cookies.