Вложенные элементы JSON не определены - PullRequest
0 голосов
/ 11 октября 2018

Мне очень трудно получить доступ к вложенным значениям в массивах JSON, и я не могу понять, почему мои попытки приводят к неопределенным значениям.Я пытаюсь определить расстояние между двумя почтовыми индексами с помощью API Google Distance Matrix.

Полное объяснение см. В нижней части этого поста.Сейчас я покажу код, выполняющий операции.

Когда пользователь завершает ввод почтового индекса для источника и пункта назначения, вызывается следующая функция JavaScript:

function calculateDistance(){

    var origin = $("#ex_origin").val(); // Success
    var destination = $("#ex_dest").val(); // Success

    obj = { "origin" : origin, "destination" : destination   }; // Set up JSON Object
        dbParam = JSON.stringify(obj); // Convert the object into a string to be used by the PHP file

        xhttp = new XMLHttpRequest();
        xhttp.onreadystatechange = function() {
            if (this.readyState == 4 && this.status == 200) {
                var result = JSON.parse(this.responseText); // Parse the JSON string so it can be read by JavaScrippt
                alert(result); // Returns JSON OBject (Expected)
                alert(result["row"][0]["elements"][0]["distance"][0].text); //Returns undefined (Undesired)

            }
        };
        xhttp.open("POST", "includes/ajax/google_maps/get_distance_info.php", true);
        xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
        xhttp.send("obj=" + dbParam);
}

Файл get_distance_info.php успешно вызван.Он содержит следующий код:

header("Content-Type: application/json; charset=UTF-8");
$obj = json_decode($_POST["obj"], false);

$origin = $obj->origin;
$destination = $obj->destination;
$key = "[Removed for Stack Overflow]";

    $url = "https://maps.googleapis.com/maps/api/distancematrix/json?origins=".$origin."&destinations=".$destination."&mode=driving&language=en-EN&key=".$key;
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array(
        'APIKEY: [Removed for Stack Overflow]',
        'Content-Type: application/json',
     ));
     curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
   curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
    // curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // These were tests
    // curl_setopt($ch, CURLOPT_PROXYPORT, 3128); // These were tests
    // curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); // These were tests
    // curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); // These were tests
    $response = curl_exec($ch);
    curl_close($ch);
    echo $response;
    // echo json_encode($response); The result does not have to be re-encoded, as it is already encoded by the Google API.

Теперь ответ, который я получаю из файла get_distance_info.php при вводе двух случайных адресов, следующий:

{
   "destination_addresses" : [ "Great Tower St, London EC3R 5BT, UK" ],
   "origin_addresses" : [ "Eccles, Manchester M30 0NB, UK" ],
   "rows" : [
      {
         "elements" : [
            {
               "distance" : {
                  "text" : "346 km",
                  "value" : 345911
               },
               "duration" : {
                  "text" : "4 hours 7 mins",
                  "value" : 14818
               },
               "status" : "OK"
            }
         ]
      }
   ],
   "status" : "OK"
}

Итак, проблема в том, что когда мы возвращаемся к первому набору кода JavaScript, я не могу получить текстовое значение расстояния, оно возвращает неопределенное значение.Но вы заметите, что попытка выглядит немного неряшливо - это связано с тем, что я перепробовал все мыслимые варианты, до такой степени, что я явно не могу определить, где я ошибаюсь.

То, что я могу определить, эточто последовательно я не могу пройти мимо объекта «элементы».Кажется, он не найден, и все, что с ним связано, возвращает undefined.

Пожалуйста, так как я теряю сюжет;Кто-нибудь видит, где проблема с этим кодом, и как я могу достичь желаемых результатов?

Подводя итог: я хочу либо значение расстояния или текст расстояния в массиве объектов JSON,но в настоящее время я получаю неопределенное значение.

Ps для всех, кто интересуется, если я раскомментирую json_encode, в моем файле get_distance_info.php он просто возвращается в виде строки, и поэтому любые итерации выполняются для каждого пользователя.символьная основа, а не как объект.

Ответы [ 2 ]

0 голосов
/ 11 октября 2018

Вы также ссылаетесь на ["distance"] [0] .text), но "distance" не является массивом.поэтому вам не нужно иметь индекс на нем.

0 голосов
/ 11 октября 2018

Похоже, вы ищете первый элемент строки:

alert(result["row"][0]["elements"][0]["distance"][0].text); //Returns undefined (Undesired)

Однако я думаю, что фактический ответ содержит 'строки', а расстояние не является массивом.

Попробуйте:

alert(result["rows"][0]["elements"][0]["distance"].text); 
...