omegastripes / VBA-JSON-parser

Backus-Naur Form JSON Parser based on RegEx for VBA
GNU General Public License v3.0
108 stars 44 forks source link

Подскажите как использовать для ответов сервиса КЛАДР в облаке #2

Closed AlexandreZaytsev closed 6 years ago

AlexandreZaytsev commented 6 years ago

Здравствуйте, вчера нашел Ваш модуль не подскажите как с помощью него распарсить JSON ответ от Кладр по подбору адреса

http://kladr-api.ru/integration/ пример их запроса http://kladr-api.ru/api.php?query=%D0%90%D1%80%D1%85&contentType=city&withParent=1&limit=2

результаты массива первого уровня удалось достать

    With CreateObject("MSXML2.XMLHTTP")
        .Open "GET", "http://kladr-api.ru/api.php?query=%D0%90%D1%80%D1%85&contentType=city&withParent=1&limit=2", False
        .send
        sJSONString = .responseText
    End With
    JSON.Parse sJSONString, vJSON, sState
    vJSON = vJSON("result")
    JSON.ToArray vJSON, aData, aHeader

а как добраться к вложенным в result массивам parents

{
    "searchContext": {                      // Объект с переданными серверу параметрами
        "query": "Арх",
        "contentType": "city",
        "withParent": 1,
        "limit": 2
    },
    "result": [                             // Массив полученных объектов заданного типа (населённые пункты)
        {
            "id": "2900000100000",          // Код объекта
            "name": "Архангельск",          // Название объекта
            "zip": null,                    // Почтовый индекс объекта
            "type": "Город",                // Тип объекта полностью
            "typeShort": "г",               // Тип объекта коротко
            "okato": "11401000000",         // Код ОКАТО
            "parents": [                    // Массив родительских объектов (если был передан параметр withParent)
                {
                    "id": "2900000000000",
                    "name": "Архангельская",
omegastripes commented 6 years ago

Александр, доступ ко вложенным элементам возможен с использованием вложенных циклов. Попробуйте начать со следующего примера:

    Option Explicit

    Sub GetData()

        Dim sJSONString As String
        Dim vJSON As Variant
        Dim sState As String
        Dim vItem
        Dim vParent

        With CreateObject("MSXML2.XMLHTTP")
            .Open "GET", "http://kladr-api.ru/api.php?query=%D0%90%D1%80%D1%85&contentType=city&withParent=1&limit=2", False
            .Send
            sJSONString = .responseText
        End With
        JSON.Parse sJSONString, vJSON, sState 
        For Each vItem In vJSON("result")
            Debug.Print vItem("id") & " / " & vItem("name")
            For Each vParent In vItem("parents")
                Debug.Print vbTab & vParent("id") & " / " & vParent("name")
            Next
        Next

    End Sub

И, кстати, в Вашем коде использование JSON.ToArray помещает в aData все элементы parent объектов массива result.