【问题标题】:JSON object error Uncaught TypeError: Cannot read property of undefinedJSON对象错误未捕获的TypeError:无法读取未定义的属性
【发布时间】:2011-07-18 17:48:32
【问题描述】:

我有一个问题,在警报窗口中为同一个对象提供值,以及在浏览器中提供 JS 错误。

在行 - “alert (obj.xtagName)” 给出错误消息。 不过,我也在警报对话框中看到了正确的输出。

对我来说很奇怪。

使用

浏览器:Chrome (v10.0.648.151)

错误 - 未捕获的类型错误:无法读取未定义的属性“xtagName”

浏览器:IE (v8.0.7600.16385CO)

错误 - 'obj.xtagName' 为 null 或不是对象

有错误的对象 - obj.xtagName

- 我有生成 JSON 字符串的 PHP 页面 (gXML.php)。此 JSON 也使用“http://www.jsonlint.com/”进行验证。 使用 AJAX 调用,我得到这个 JSON 并根据 responseText 将其转换为 JSON 对象。

-文件开头:_ajax.js

AJAX 代码调用

function gQuote_getData() {
var request = _getHTTPObject();
var url = "php/gXML.php";
if (request) {
    request.onreadystatechange = function() {gQuote_parseResponse(request);};
    request.open( "GET", url, true );
    request.setRequestHeader("If-Modified-Since", "Sat, 1 Jan 1900 00:00:00 GMT");
    request.send(null);
    return true;
} else {
    return false;
} }

XMLRespObj

function _getHTTPObject() {
var xhr = false;
if (window.XMLHttpRequest) {
    xhr = new XMLHttpRequest();
} else if (window.ActiveXObject) {
    try {
        xhr = new ActiveXObject("Msxml2.XMLHTTP");
    } catch(e) {
        try {
            xhr = new ActiveXObject("Microsoft.XMLHTTP");
        } catch(e) {
            xhr = false;
        }
    }
}
return xhr;}

接收响应

function gQuote_parseResponse(request) {
var resp;
if (request.readyState == 4) {
    if (request.status == 200 || request.status == 304) {
        //Helps trim extra space at beginning and end of contruct
        resp = (request.responseText.replace(/^\s+|\s+$/g, ''));
    }
}
fillOutput (resp);
//printX(gQuote_JSON);}

  • 文件 js/_ajax.js 结束

-

HTML 页面 JS 脚本

    function fillOutput (resp_text) {
    document.getElementById("output").value = resp_text
    printX(resp_text) }
    function printX (r_text) {
    var Xml2String = r_text;
    var myobj = (new Function("return " + Xml2String))() 
    tblvl = "xml_api_reply.finance";
    tblvl = tblvl.split (".");
    obj = myobj;
    for (var tg in tblvl )
    {
        var xtag;
        try {
            xtag = obj.xtagName;
            if (obj.xtagName == tblvl[tg])
            {
                //alert (obj.xtagName + obj.tags.length)
                obj = obj.tags[0]
            }
        }
        catch (e) {
            //xtag = obj.xtagName;
        }
    }
    alert (obj.xtagName)
    alert (obj.tagAttrb.data)   }

在行 - “alert (obj.xtagName)” 给出了上述错误消息。 不过,我也在警报对话框中看到了正确的输出。

我浏览了这个论坛的各种主题,但找不到类似的东西。 到目前为止我发现的是关于 - 格式错误的 JSON(带有额外的逗号) - 对 jQuery 的担忧(这里我没有使用 jQuery)

我在这里想念的重点是什么。我只是一个基本的 JS 用户。

其次,“xtagName”和“tagAttrb”都是来自同一个 JSON 对象的对象。那么,是什么导致其中一个出错而其他工作正常。

更奇怪的是我有另一个版本的相同代码,它组织得不好,代码运行良好。

请帮忙。


以下是 JSON 字符串的摘录

{"xtagName":"xml_api_reply",
"tagAttrb":{"version":"1"}
, "tags": [
    {"xtagName":"finance",
    "tagAttrb":{"module_id":"0", "tab_id":"0", "mobile_row":"0", "mobile_zipped":"1", "row":"0", "section":"0"}
    , "tags": [
        {"xtagName":"symbol",
        "tagAttrb":{"data":".BSEREAL"}
        , "tags": []},
        {"xtagName":"pretty_symbol",
        "tagAttrb":{"data":".BSEREAL"}
        , "tags": []},
        {"xtagName":"daylight_savings",
        "tagAttrb":{"data":"true"}
        , "tags": []}]}]}

【问题讨论】:

    标签: ajax json


    【解决方案1】:

    obj 是一个匿名函数,而不是等效于 JSON 脚本的对象。请参阅下面的代码中引用的第 1 行和第 4 行。

    1 var myobj = (new Function("return " + Xml2String))() 
    2     tblvl = "xml_api_reply.finance";
    3     tblvl = tblvl.split (".");
    4     obj = myobj;
    

    【讨论】:

    • 感谢 Apalala 的快速回复。我怀疑这可能会导致任何问题。 “新功能......”调用,我从谷歌借来作为参考,其他人正在成功使用。无论如何,我发现了问题 - 这是由于“fillOutput(resp);”的错误放置,这被称为AJAX响应的所有状态。
    猜你喜欢
    • 2020-05-16
    • 2015-12-10
    • 2015-06-13
    • 1970-01-01
    • 1970-01-01
    • 2018-11-05
    • 2016-11-17
    • 1970-01-01
    • 2023-01-14
    相关资源
    最近更新 更多