Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Разбор массива JSON ответа (https://javascript.ru/forum/misc/84861-razbor-massiva-json-otveta.html)

frost56 19.01.2023 03:32

Разбор массива JSON ответа
 
Получил ответ от сервера, на php бы давно решил, а как вытащить в лог значение "AddressLine": "Россия, Москва, улица Петровка, 38с11", ?


Ответ JSON:
Код:

{
        "response":
        {
                "GeoObjectCollection":
                {
                        "metaDataProperty":
                        {
                                "GeocoderResponseMetaData":
                                {
                                        "Point":
                                        {
                                                "pos": "37.6154 55.7701"
                                        },
                                        "request": "55.7701,37.6154",
                                        "results": "10",
                                        "found": "8"
                                }
                        },
                        "featureMember": [
                        {
                                "GeoObject":
                                {
                                        "metaDataProperty":
                                        {
                                                "GeocoderMetaData":
                                                {
                                                        "precision": "exact",
                                                        "text": "Россия, Москва, улица Петровка, 38с11",
                                                        "kind": "house",
                                                        "Address":
                                                        {
                                                                "country_code": "RU",
                                                                "formatted": "Россия, Москва, улица Петровка, 38с11",
                                                                "postal_code": "127994",
                                                                "Components": [
                                                                {
                                                                        "kind": "country",
                                                                        "name": "Россия"
                                                                },
                                                                {
                                                                        "kind": "province",
                                                                        "name": "Центральный федеральный округ"
                                                                },
                                                                {
                                                                        "kind": "province",
                                                                        "name": "Москва"
                                                                },
                                                                {
                                                                        "kind": "locality",
                                                                        "name": "Москва"
                                                                },
                                                                {
                                                                        "kind": "street",
                                                                        "name": "улица Петровка"
                                                                },
                                                                {
                                                                        "kind": "house",
                                                                        "name": "38с11"
                                                                }]
                                                        },
                                                        "AddressDetails":
                                                        {
                                                                "Country":
                                                                {
                                                                        "AddressLine": "Россия, Москва, улица Петровка, 38с11",
                                                                        "CountryNameCode": "RU",
                                                                        "CountryName": "Россия",
                                                                        "AdministrativeArea":
                                                                        {
                                                                                "AdministrativeAreaName": "Москва",
                                                                                "Locality":
                                                                                {
                                                                                        "LocalityName": "Москва",
                                                                                        "Thoroughfare":
                                                                                        {
                                                                                                "ThoroughfareName": "улица Петровка",
                                                                                                "Premise":
                                                                                                {
                                                                                                        "PremiseNumber": "38с11",
                                                                                                        "PostalCode":
                                                                                                        {
                                                                                                                "PostalCodeNumber": "127994"
                                                                                                        }
                                                                                                }
                                                                                        }
                                                                                }
                                                                        }
                                                                }
                                                        }
                                                }
                                        },
                                        "name": "улица Петровка, 38с11",
                                        "description": "Москва, Россия",
                                        "boundedBy":
                                        {
                                                "Envelope":
                                                {
                                                        "lowerCorner": "37.61123 55.767808",
                                                        "upperCorner": "37.619441 55.772436"
                                                }
                                        },
                                        "Point":
                                        {
                                                "pos": "37.615336 55.770122"
                                        }
                                }
                        },
                        {
                                "GeoObject":
                                {
                                        "metaDataProperty":
                                        {
                                                "GeocoderMetaData":
                                                {
                                                        "precision": "street",
                                                        "text": "Россия, Москва, улица Петровка",
                                                        "kind": "street",
                                                        "Address":
                                                        {
                                                                "country_code": "RU",
                                                                "formatted": "Россия, Москва, улица Петровка",
                                                                "Components": [
                                                                {
                                                                        "kind": "country",
                                                                        "name": "Россия"
                                                                },
                                                                {
                                                                        "kind": "province",
                                                                        "name": "Центральный федеральный округ"
                                                                },
                                                                {
                                                                        "kind": "province",
                                                                        "name": "Москва"
                                                                },
                                                                {
                                                                        "kind": "locality",
                                                                        "name": "Москва"
                                                                },
                                                                {
                                                                        "kind": "street",
                                                                        "name": "улица Петровка"
                                                                }]
                                                        },
                                                        "AddressDetails":
                                                        {
                                                                "Country":
                                                                {
                                                                        "AddressLine": "Россия, Москва, улица Петровка",
                                                                        "CountryNameCode": "RU",
                                                                        "CountryName": "Россия",
                                                                        "AdministrativeArea":
                                                                        {
                                                                                "AdministrativeAreaName": "Москва",
                                                                                "Locality":
                                                                                {
                                                                                        "LocalityName": "Москва",
                                                                                        "Thoroughfare":
                                                                                        {
                                                                                                "ThoroughfareName": "улица Петровка"
                                                                                        }
                                                                                }
                                                                        }
                                                                }
                                                        }
                                                }
                                        },
                                        "name": "улица Петровка",
                                        "description": "Москва, Россия",
                                        "boundedBy":
                                        {
                                                "Envelope":
                                                {
                                                        "lowerCorner": "37.611634 55.758843",
                                                        "upperCorner": "37.620016 55.770228"
                                                }
                                        },
                                        "Point":
                                        {
                                                "pos": "37.616458 55.765012"
                                        }
                                }
                        },
                        {
                                "GeoObject":
                                {
                                        "metaDataProperty":
                                        {
                                                "GeocoderMetaData":
                                                {
                                                        "precision": "other",
                                                        "text": "Россия, Москва, Центральный административный округ, Тверской район",
                                                        "kind": "district",
                                                        "Address":
                                                        {
                                                                "country_code": "RU",
                                                                "formatted": "Россия, Москва, Центральный административный округ, Тверской район",
                                                                "Components": [
                                                                {
                                                                        "kind": "country",
                                                                        "name": "Россия"
                                                                },
                                                                {
                                                                        "kind": "province",
                                                                        "name": "Центральный федеральный округ"
                                                                },
                                                                {
                                                                        "kind": "province",
                                                                        "name": "Москва"
                                                                },
                                                                {
                                                                        "kind": "locality",
                                                                        "name": "Москва"
                                                                },
                                                                {
                                                                        "kind": "district",
                                                                        "name": "Центральный административный округ"
                                                                },
                                                                {
                                                                        "kind": "district",
                                                                        "name": "Тверской район"
                                                                }]
                                                        },
                                                        "AddressDetails":
                                                        {
                                                                "Country":
                                                                {
                                                                        "AddressLine": "Россия, Москва, Центральный административный округ, Тверской район",
                                                                        "CountryNameCode": "RU",
                                                                        "CountryName": "Россия",
                                                                        "AdministrativeArea":
                                                                        {
                                                                                "AdministrativeAreaName": "Москва",
                                                                                "Locality":
                                                                                {
                                                                                        "LocalityName": "Москва",
                                                                                        "DependentLocality":
                                                                                        {
                                                                                                "DependentLocalityName": "Центральный административный округ",
                                                                                                "DependentLocality":
                                                                                                {
                                                                                                        "DependentLocalityName": "Тверской район"
                                                                                                }
                                                                                        }
                                                                                }
                                                                        }
                                                                }
                                                        }
                                                }
                                        },
                                        "name": "Тверской район",
                                        "description": "Центральный административный округ, Москва, Россия",
                                        "boundedBy":
                                        {
                                                "Envelope":
                                                {
                                                        "lowerCorner": "37.575199 55.746821",
                                                        "upperCorner": "37.634838 55.792448"
                                                }
                                        },
                                        "Point":
                                        {
                                                "pos": "37.613171 55.762566"
                                        }
                                }
                        },
                        {
                                "GeoObject":
                                {
                                        "metaDataProperty":
                                        {
                                                "GeocoderMetaData":
                                                {
                                                        "precision": "other",
                                                        "text": "Россия, Москва, Центральный административный округ",
                                                        "kind": "district",
                                                        "Address":
                                                        {
                                                                "country_code": "RU",
                                                                "formatted": "Россия, Москва, Центральный административный округ",
                                                                "Components": [
                                                                {
                                                                        "kind": "country",
                                                                        "name": "Россия"
                                                                },
                                                                {
                                                                        "kind": "province",
                                                                        "name": "Центральный федеральный округ"
                                                                },
                                                                {
                                                                        "kind": "province",
                                                                        "name": "Москва"
                                                                },
                                                                {
                                                                        "kind": "locality",
                                                                        "name": "Москва"
                                                                },
                                                                {
                                                                        "kind": "district",
                                                                        "name": "Центральный административный округ"
                                                                }]
                                                        },
                                                        "AddressDetails":
                                                        {
                                                                "Country":
                                                                {
                                                                        "AddressLine": "Россия, Москва, Центральный административный округ",
                                                                        "CountryNameCode": "RU",
                                                                        "CountryName": "Россия",
                                                                        "AdministrativeArea":
                                                                        {
                                                                                "AdministrativeAreaName": "Москва",
                                                                                "Locality":
                                                                                {
                                                                                        "LocalityName": "Москва",
                                                                                        "DependentLocality":
                                                                                        {
               
                                                "pos": "37.617698 55.755864"
                                        }
                                }
                        },
                        {
                                "GeoObject":
                                {
                                        "metaDataProperty":
                                        {
                                                "GeocoderMetaData":
                                                {
                                                        "precision": "other",
                                                        "text": "Россия, Центральный федеральный округ",
                                                        "kind": "province",
                                                        "Address":
                                                        {
                                                                "country_code": "RU",
                                                                "formatted": "Россия, Центральный федеральный округ",
                                                                "Components": [
                                                                {
                                                                        "kind": "country",
                                                                        "name": "Россия"
                                                                },
                                                                {
                                                                        "kind": "province",
                                                                        "name": "Центральный федеральный округ"
                                                                }]
                                                        },
                                                        "AddressDetails":
                                                        {
                                                                "Country":
                                                                {
                                                                        "AddressLine": "Россия, Центральный федеральный округ",
                                                                        "CountryNameCode": "RU",
                                                                        "CountryName": "Россия"
                                                                }
                                                        }
                                                }
                                        },
                                        "name": "Центральный федеральный округ",
                                        "description": "Россия",
                                        "boundedBy":
                                        {
                                                "Envelope":
                                                {
                                                        "lowerCorner": "30.748407 49.556986",
                                                        "upperCorner": "47.6426 59.623738"
                                                }
                                        },
                                        "Point":
                                        {
                                                "pos": "38.064727 54.87375"
                                        }
                                }
                        },
                        {
                                "GeoObject":
                                {
                                        "metaDataProperty":
                                        {
                                                "GeocoderMetaData":
                                                {
                                                        "precision": "other",
                                                        "text": "Россия",
                                                        "kind": "country",
                                                        "Address":
                                                        {
                                                                "country_code": "RU",
                                                                "formatted": "Россия",
                                                                "Components": [
                                                                {
                                                                        "kind": "country",
                                                                        "name": "Россия"
                                                                }]
                                                        },
                                                        "AddressDetails":
                                                        {
                                                                "Country":
                                                                {
                                                                        "AddressLine": "Россия",
                                                                        "CountryNameCode": "RU",
                                                                        "CountryName": "Россия"
                                                                }
                                                        }
                                                }
                                        },
                                        "name": "Россия",
                                        "boundedBy":
                                        {
                                                "Envelope":
                                                {
                                                        "lowerCorner": "19.484764 41.185996",
                                                        "upperCorner": "191.128012 81.886117"
                                                }
                                        },
                                        "Point":
                                        {
                                                "pos": "99.505405 61.698657"
                                        }
                                }
                        }]
                }
        }
}


voraa 19.01.2023 07:23

obj.response.GeoObjectCollection.featureMember[0].GeoObject.metaDataProperty.GeocoderMetaData.Addre ssDetails.Country.AddressLine

рони 19.01.2023 07:59

frost56,
Цитата:

Сообщение от frost56
как вытащить в лог значение "AddressLine": "Россия, Москва, улица Петровка, 38с11", ?

никак, предоставленный объект имеет нарушения структуры.
иначе можно было-бы так
console.log(obj.response.GeoObjectCollection.featureMember[0].GeoObject.metaDataProperty.GeocoderMetaData.AddressDetails.Country.AddressLine)


или так
<script src="https://nervgh.github.io/js/recursive-iterator.min.js"></script>
    <script>
        let obj = {
        }
        for (let {
                node,
                path
            } of new RecursiveIterator(obj)) {
            if (path.includes('AddressLine')) {
                console.log(node);
                break
            }
        }
    </script>

Frost56ru 19.01.2023 17:21

Цитата:

Сообщение от рони (Сообщение 550092)
frost56,

никак, предоставленный объект имеет нарушения структуры.
иначе можно было-бы так
console.log(obj.response.GeoObjectCollection.featureMember[0].GeoObject.metaDataProperty.GeocoderMetaData.AddressDetails.Country.AddressLine)


или так
<script src="https://nervgh.github.io/js/recursive-iterator.min.js"></script>
    <script>
        let obj = {
        }
        for (let {
                node,
                path
            } of new RecursiveIterator(obj)) {
            if (path.includes('AddressLine')) {
                console.log(node);
                break
            }
        }
    </script>

Это ответ от яндекса, как там могла бы быть нарушена целостность?
Вот полный ответ
Код:

https://wtools.io/paste-code/bIYj

Frost56ru 19.01.2023 17:49

Цитата:

Сообщение от voraa (Сообщение 550089)
obj.response.GeoObjectCollection.featureMember[0].GeoObject.metaDataProperty.GeocoderMetaData.Addre ssDetails.Country.AddressLine


Вывод: console.log(response.GeoObjectCollection.featureMe mber[0].GeoObject.metaDataProperty.GeocoderMetaData.Addre ssDetails.Country.AddressLine);


Ответ:
Код:

event_properties.js:38 Uncaught TypeError: Cannot read properties of undefined (reading 'featureMember')
    at xhr.onload (event_properties.js:38:58)


рони 19.01.2023 18:41

Цитата:

Сообщение от Frost56ru
Вот полный ответ

по ссылке всё в порядке -- путь
response.GeoObjectCollection.featureMember[0].GeoObject.metaDataProperty.GeocoderMetaData.AddressDetails.Country.AddressLine
должен работать

Frost56ru 19.01.2023 18:47

Цитата:

Сообщение от рони (Сообщение 550096)
по ссылке всё в порядке -- путь
response.GeoObjectCollection.featureMember[0].GeoObject.metaDataProperty.GeocoderMetaData.AddressDetails.Country.AddressLine
должен работать

К сожалению не работает:

Код:
ymaps.ready(init);
var myMap;

function init () {
    myMap = new ymaps.Map("map", {
        center: [55.7519, 37.6116], // MSK
        zoom: 11
    }, {
        balloonMaxWidth: 500,
        searchControlProvider: 'yandex#search'
    });

    // Обработка события, возникающего при щелчке
    // левой кнопкой мыши в любой точке карты.
    // При возникновении такого события откроем балун.
    myMap.events.add('click', function (e) {
        if (!myMap.balloon.isOpen()) {
            var coords = e.get('coords');
            myMap.balloon.open(coords, {
                contentHeader:'Поиск адреса для доставки...',
                contentBody:
                    '<p>Это ваш дом?' + [
                    coords[0].toPrecision(6),
                    coords[1].toPrecision(6)
                    ].join(', ') + '</p>',
                contentFooter:'<sup>Щелкните еще раз чтобы закрыть</sup>'
            });
            var sjoin = [coords[0].toPrecision(6),coords[1].toPrecision(6)].join(',');
            const xhr = new XMLHttpRequest();
            xhr.open('GET', 'https://geocode-maps.yandex.ru/1.x/?apikey=80544-a071-416d-908a-66ad26bf029d&geocode='+sjoin+'&sco=latlong&format=json');
            xhr.responseType="json";
            xhr.onload = () => {
                if(xhr.status !== 200){
                    console.log(`Ошибка ${xhr.status}: ${xhr.statusText}`);
                    return;
                }
                const response = xhr.response;
                console.log(response.GeoObjectCollection.featureMember[0].GeoObject.metaDataProperty.GeocoderMetaData.AddressDetails.Country.AddressLine);

            };
            xhr.onerror = () => {
              console.log(`Ошибка выполнения запроса`);
            };
            xhr.send();

        }
        else {
            myMap.balloon.close();
        }
    });

    // Обработка события, возникающего при щелчке
    // правой кнопки мыши в любой точке карты.
    // При возникновении такого события покажем всплывающую подсказку
    // в точке щелчка.
    myMap.events.add('contextmenu', function (e) {
        myMap.hint.open(e.get('coords'), 'Отметьте свой дом на карте');
    });
    
    // Скрываем хинт при открытии балуна.
    myMap.events.add('balloonopen', function (e) {
        myMap.hint.close();
    });
}


Ответ в логе:
Код:

event_properties.js:38 Uncaught TypeError: Cannot read properties of undefined (reading 'featureMember')
    at xhr.onload (event_properties.js:38:58)


рони 19.01.2023 19:05

Frost56ru,
а так
const response = JSON.parse(xhr.response);

Frost56ru 19.01.2023 19:10

Цитата:

Сообщение от рони (Сообщение 550098)
Frost56ru,
а так
const response = JSON.parse(xhr.response);

VM12892:1 Uncaught SyntaxError: "[object Object]" is not valid JSON
at JSON.parse (<anonymous>)
at xhr.onload (event_properties.js:37:39)

рони 19.01.2023 20:08

Frost56ru,
что у вас в response, посмотреть можно только вам.


Часовой пояс GMT +3, время: 23:40.