2010-02-19 73 views
2

我不明白,爲什麼在jQuery的parseJSON功能測試:對於字符串在jQuery的parseJSON正則表達式測試返回false - 爲什麼?

/^[\],:{}\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函數失敗...
我還測試了這個/^[\],:{}\s]*$/.test...函數單獨在Firebug與提到的字符串。

[編輯] 好,代碼:

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"}' 

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

那麼可以隱藏在這個(可能是)字符串對象opData裏面,以防止它工作?

+0

ProcessFetchedTerm輸出中的警報是什麼? – rosscj2533 2010-02-19 16:21:44

+0

添加警報輸出到問題... – Priednis 2010-02-19 17:13:34

+0

還有幾件事要嘗試:'alert(opData === json);'。我認爲這將不得不顯示虛假,因爲它們似乎不是平等的。另外,嘗試用'eval(opData)'替換'$ .parseJSON(opData);'。這應該做同樣的事情,如果它的工作,這將意味着這是一個問題與jQuery。 – rosscj2533 2010-02-19 19:23:05

回答

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通話之前添加你的第一條警報,看看它在那裏。

+0

我也在想(移動第三和第四警報)。但它無論如何都失敗了。 'parseJSON'函數拋出'「無效的JSON:{」TermTitle「:」某標題「}」'錯誤。 我也嘗試將「你的」代碼添加到同一個函數ProcessFetchedTerm中,它可以工作,但是來自'opData'的值不起作用。 也許它可能與編碼問題有關...? – Priednis 2010-02-19 17:32:51

+0

我想它可能是某種編碼問題,但我不知道它會是什麼。我會嘗試調試它,當你得到你的'「無效的JSON」'錯誤,並試圖找到我的代碼中的'json'變量的值和'代碼中'opData'的值之間的差異... – rosscj2533 2010-02-19 18:01:49

0

它返回「false」,因爲它不匹配。「替換」調用將該JSON字符串轉換爲「{::}}」,它與正則表達式不匹配。

oh durrr yes it does match;以及我不知道你的問題是什麼。你爲什麼認爲它返回「假」?

相關問題