2012-02-14 3 views
0

Это вид из моего браузера:Цель синтаксического анализа помощи

{ 
    "data": { 
     "request": [{ 
      "query": "Lat 41.85 and Lon -87.65", 
      "type": "LatLon" 
     }], 
     "time_zone": [{ 
      "localtime": "2012-02-14 16:05", 
      "utcOffset": "-6.0" 
     }] 
    } 
} 

Теперь я использую этот код, чтобы разобрать его:

function getTimeZone(latlong) { 
    jQuery(document).ready(function ($) { 
     $.ajax({ 
      url: "http://www.worldweatheronline.com/feed/tz.ashx?key=[removed]&q=" + latlong + "&format=json", 
      dataType: "jsonp", 
      success: function (parsed_json) { 
       console.log(parsed_json.time_zone.utcOffset); 
       return parsed_json.time_zone.utcOffset; 
      }, 
      error: function (parsed_json) { 
       //console.log("Error: " + parsed_json); 
      } 
     }); 
    }); 
} 

Каждый раз, когда я запускаю код, я получаю эта ошибка:

Uncaught TypeError: Cannot read property 'utcOffset' of undefined 

Любая помощь была бы принята с благодарностью.

Просмотр данных отображается на консоли (только скопировал часть я заинтересован в):

Result: 
    Object 
    data: Object 
     request: Array[1] 
     time_zone: Array[1] 
      0: Object 
      localtime: "2012-02-14 16:46" 
      utcOffset: "-6.0" 

ответ

3

На самом деле, есть два вопроса:

1), чтобы получить доступ к содержимому, вам необходимо:

parsed_json.data.time_zone [0] .utcOffset;

2) Это немного сложнее - вы используете асинхронный обратный вызов ajax - success() не вызывается до того, как ваша программа завершает отправку запроса ajax и возвращает его, и она не возвращает свои результаты родительскому методу ,

В основном это невозможно сделать, если вы не используете синхронную выборку (плохая идея, так как она заблокирует ваш браузер до тех пор, пока не поступит ответ).

Вместо этого возьмите параметр обратного вызова, который будет функция, в качестве параметра вашей функции, и называют, что в результате, как только он приходит:

т.е.

function getTimeZone(latlong, callback) { 
    jQuery(document).ready(function ($) { 
     $.ajax({ 
      url: "http://www.worldweatheronline.com/feed/tz.ashx?key=[removed]&q=" + latlong + "&format=json", 
      dataType: "jsonp", 
      success: function (parsed_json) { 
       console.log(parsed_json.time_zone.utcOffset); 
       callback(latlong, parsed_json.data.time_zone[0].utcOffset); 
      }, 
      error: function (parsed_json) { 
       //console.log("Error: " + parsed_json); 
      } 
     }); 
    }); 
} 

Затем, чтобы использовать его :

getTimeZone(myLatLong, function(latLong, utcOffset) { 
    // ... do something with utcOffset here ... 
}); 
+0

Результат: Объект данные: Объект запрос: Array [1] TIME_ZONE: Array [1 ] 0: Объект localtime: "2012-02-14 16:39" utcOffset: "-6.0" Похоже, что он получает правильные данные. – Kruug

+0

В Chrome/FF + Firebug вы получаете хороший вложенный древовидный дисплей в консоли JS, чтобы вы могли просматривать объект и лучше понимать, как он структурирован. – jka6510

+0

Что я разместил, это то, что было показано консолью Chrome. – Kruug

1

Должно быть

return parsed_json.data.time_zone[0].utcOffset; 

Вы должны внимательно посмотреть на возвращаемом JSON состав. Это помогает разбить его на отдельные строки и отступ, чтобы отразить гнездование.

+0

Это, кажется, не помогает. Причина, по которой я не добавил [0], был не в цикле. Это имеет значение? Не знаете, как разбить его, так как это JSON. Я возвращаюсь от провайдера, ничего не могу изменить. – Kruug

+1

Это потому, что элемент «time_zone» возвращается как числовой индексный массив, поэтому вам нужно [0] выбрать первый элемент из него - я предполагаю, что это означает, что провайдер мог бы предоставить более одного часового пояса в ответе, но если вы просто хочу первый, который должен работать нормально. – jka6510

+0

Хорошо. Спасибо за это разъяснение. – Kruug

0

должно быть parsed_json.data.time_zone[0].utcOffset?

+0

Кажется, это не помогает.Причина, по которой я не добавил [0], был не в цикле. Это имеет значение? – Kruug

+0

значение для часового пояса является массивом объектов, в вашем примере только один объект, поэтому ее индекс равен 0 и должен быть указан –

Смежные вопросы