JSON对象错误Uncaught TypeError:无法读取undefined的属性

时间:2011-03-19 12:44:24

标签: ajax json

我遇到了一个问题,即同一个Object在警报窗口中提供值,并在浏览器中显示JS错误。

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

对我来说很奇怪。

使用

浏览器:Chrome(v10.0.648.151)

错误 - 未捕获的TypeError:无法读取未定义的属性'xtagName'

浏览器:IE(v8.0.7600.16385CO)

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

带错误的对象 - obj.xtagName

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

-Start of File:_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": []}]}]}

1 个答案:

答案 0 :(得分:0)

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

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