2009-09-24 63 views
0

我的服務返回以下JSON對象,並將Content-Type頭設置爲「application/javascript」。它包裹在每個指令parens json.org] 2,但我嘗試過和沒有parens。沒有parens,它通過了jsonlint的驗證。使用Prototype解析JSON結果的問題

({"products": {"itemId": "0", "productId": "1234", "quantity": "4", "rank": "12", "subProductId": ""}, "txnId": "1"}) 

如果我明確EVAL的反應,如下所示,我沒有問題:

var form = $('productListRequestForm'); 
form.request(
{ 
    onSuccess : 
     function(response) 
     { 
      var json = eval(response.responseText); 
      rebuildWishlistTable(json); 
     }, 
    onFailure : 
     function(response) 
     { 
      alert("AJAX request failed: " + response.responseText); 
     } 
}); 

然而,如果我靠原型解析響應和通過解析的結果作爲第二個參數,以我的功能如下,該值始終爲空。根據Prototype docs,這應該工作。有什麼我錯過了,或者他們錯過了什麼?

var form = $('productListRequestForm'); 
    form.request(
    { 
     onSuccess : function(response, json) 
      { 
       rebuildWishlistTable(json); 
      }, 
     onFailure : 
      function(response) 
      { 
       alert("AJAX request failed: " + response.responseText); 
      } 
    }); 

回答

1

它看起來像在原型中的錯誤。

在修訂1.6.1線1497,有下面的代碼:

var contentType = response.getHeader('Content-type'); 
    if (this.options.evalJS == 'force' 
     || (this.options.evalJS && this.isSameOrigin() && contentType 
     && contentType.match(/^\s*(text|application)\/(x-)?(java|ecma)script(;.*)?\s*$/i))) 
    this.evalResponse(); 

注意,沒有什麼是從evalResponse()返回來完成。如果我們再進入該函數的定義:

evalResponse: function() { 
    try { 
     return eval((this.transport.responseText || '').unfilterJSON()); 
    } catch (e) { 
     this.dispatchException(e); 
    } 
    }, 

發佈的原型網站的錯誤,並與我有「的幾個誤區」關於JSON評論關閉,不應該使用錯誤報告系統獲得幫助。有趣的是,我認爲我正在指出他們在哪裏扔掉了回報價值。

如果其他人可能有類似的情況,我編輯我的問題,以顯示有效的代碼,並且不起作用,並將接受此答案。

0

用括號

eval("({\"products\"": {\"itemId\": \"0\", \"productId\": \"1234\", \"quantity\": \"4\", \"rank\": \"12\", \"subProductId\": \"\"}, \"txnId\": \"1\"})") 

圍繞着它,將工作適合你

+0

不,實際上沒有。正如我在我的文章中指出的那樣,顯式評估工作 - 正如我還注意到的那樣,我將JSON包裝在parens中來實現這一點。問題是Prototype的自動評估不起作用,無論JSON是否包裝在parens中。 – kdgregory 2009-09-24 19:07:15