jQuery的parseJSON中的正则表达式测试返回false - 为什么?

时间:2010-02-19 14:57:51

标签: javascript jquery regex json

我不明白为什么在jQuery的parseJSON函数中进行测试:

/^[\],:{}\s]*$/.test(data.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, "@")
            .replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, "]")
            .replace(/(?:^|:|,)(?:\s*\[)+/g, ""))

为字符串返回false{"TermTitle":"some Title"}
http://www.jsonlint.com/中的测试告诉我字符串{"TermTitle":"some Title"}是有效的JSON,但当我尝试将其传递到$.parseJSON(opData)parseJSON函数失败...
我还使用上面提到的字符串在Firebug中单独测试了这个/^[\],:{}\s]*$/.test...函数。

[编辑] 好的,代码:

var json = '{"TermTitle":"some Title"}';  
var obj = $.parseJSON(json);  
alert('obj = ' + obj + ' and obj.TermTitle = ' + obj.TermTitle);

也适合我。

但在我的情况下,我在JavaScript中有以下内容:

function GetTerm($iInd) {  
    $.ajax({  
        type: "POST",  
        url: "get_term.php",  
        data: {  
            id: $iInd  
        },  
        success: function(data){  
            ProcessFetchedTerm(data);  
        }  
    });  
    //If I tried adding dataType: "json" then it would stop working at all.
}  

function ProcessFetchedTerm(opData) {  
    alert ("In ProcessFetchedTerm, data: '" + opData + "'");  
    alert ("typeof opData: " + typeof opData);  

    alert ("Replacement result of the regex function: " +  
      opData.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, "@").  
          replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, "]").  
          replace(/(?:^|:|,)(?:\s*\[)+/g, ''));  

    alert ("Result of the regex function: " +  
      /^[\],:{}\s]*$/.  
          test(opData.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, "@").  
          replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, "]").  
          replace(/(?:^|:|,)(?:\s*\[)+/g, '')));  

    var oTerm = $.parseJSON(opData);  
    alert('oTerm = ' + oTerm + ' and oTerm.TermTitle = ' + oTerm.TermTitle);  
}  

并在get_term.php我有:

echo json_encode(  
    array(  
        "TermTitle"=>"some Title"  
    )  
);  

警报返回:
In ProcessFetchedTerm, data: '{"TermTitle":"some Title"}'
typeof opData: string
Replacement result of the regex function: {]:]}
Result of the regex function: false
最后一个警报未显示

[编辑2]

我将函数ProcessFetchedTerm的开头重写为

function ProcessFetchedTerm(opData) {  

    var json = '{"TermTitle":"some Title"}';  
    alert ("In ProcessFetchedTerm, opData: '" + opData + "' json: '" + json + "'");  

    var oTerm = $.parseJSON(json);  

警报发出:

In ProcessFetchedTerm, opData: '{"TermTitle":"some Title"}' json: '{"TermTitle":"some Title"}'  

所以字符串是相等的,如果下一行是var oTerm = $.parseJSON(json);它可以工作,但如果下一行是var oTerm = $.parseJSON(opData);则它不起作用。

那么可能隐藏在这个(可能是)的字符串对象opData中会阻止它工作吗?

2 个答案:

答案 0 :(得分:1)

运行此代码:

var json = '{"TermTitle":"some Title"}';
var obj = $.parseJSON(json);
alert('obj = ' + obj + ' and obj.TermTitle = ' + obj.TermTitle);

适合我(使用jQuery 1.4)。问题必须在您的代码中的其他位置。当parseJSON方法失败时,您运行的确切代码是什么?

编辑(对已发布代码的回复): 你为什么要做第3和第4次警报的功能?我猜这会改变你的opData值。尝试在parseJSON来电之前添加您的第一个提醒,并查看其中的内容。

答案 1 :(得分:0)

它返回“false”,因为它不匹配。 “replace”调用将JSON字符串转换为“{]:]}',这与正则表达式不匹配。

[编辑]哦durrr是的它确实匹配;好吧,我不知道你的问题是什么。为什么你认为它返回“假”?