寻找解析援助

时间:2012-02-14 22:31:32

标签: javascript json parsing

这是我浏览器的视图:

{
    "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 个答案:

答案 0 :(得分:3)

实际上,有两个问题:

1)要访问内容,您需要:

parsed_json.data.time_zone [0] .utcOffset;

2)这有点复杂 - 您正在使用异步ajax回调 - 在程序完成发送ajax请求并返回之前未调用success(),并且它不会将其结果返回给父方法。

基本上不能按照你想要的方式去做,除非你使用同步提取(一个坏主意,因为它会锁定你的浏览器,直到响应到来)。

相反,将一个函数的回调参数作为函数的参数,并在结果到达时调用该参数:

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 ...
});

答案 1 :(得分:1)

应该是

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

您必须仔细查看返回的JSON结构。它有助于将其分解为单独的行并缩进以反映嵌套。

答案 2 :(得分:0)

应该是parsed_json.data.time_zone[0].utcOffset吗?