2011-02-18 40 views
1

我有一些使用jQuery 1.4.2的莫名其妙的行爲,我開始認爲它可能是一個safari問題,而不是jQuery之一。讓我解釋。jquery ajax方法與dataType'json'錯誤地解析json數據

我開始根本不夠用.getJSON這樣的:

$.getJSON("/challenge/results", form_data, function(data){ 
    //I know console.log is bad news, just a simplification. 
    console.log('data', data); 
} 

和日誌給我沿着

>locations: Array (1) 

行的東西,而我所期待的大小2.所以數組我看了看json的迴應:

{"locations": 
[{"customer_id":2,"editable":true,"id":971,"latitude":43.659208,"longitude":-79.407501,"max_zoom":25,"min_zoom":9,"name":"test"}, 
{"customer_id":3,"editable":true,"id":974,"latitude":36.746944,"longitude":-107.970899,"max_zoom":25,"min_zoom":9,"name":"test2"}]} 

爲了這個緣故,我已經簡化了它清晰度,但據我所知,收到的json是完全有效的(通過rails以編程方式生成)。 [更新: JSONLint證實了這一假設。]

我感到意外,所以我將我請求到$就要求看他們之間有一些細微的差別(從那以後,尋找源的jQuery我看到$ .getJSON只需調用$ .ajax)。

$.ajax({ 
     url:"/challenge/results", 
     dataType: 'json', 
     data: form_data, 
     cache:false, 
     success: function(data, textStatus){ 
      console.log("data!", data, textStatus); 
     }); 

但是唉!同樣的反應:

位置:陣列(1)成功

在這一點上,我必須承認 - 我開始有點傻,所以我想我會嘗試一些完全註定要失敗:

$.ajax({ 
     url:"/challenge/results", 
     dataType: 'text', 
     data: form_data, 
     cache:false, 
     success: function(data, textStatus){ 
      console.log("Parsed:!", $.parseJSON(data), textStatus); 
     }); 

出乎我的意料我的控制檯讀取:

位置:陣列(2)成功

我被難住了。在這一點上,我挖掘了自己的腳後跟並仔細研究了jQuery源代碼(1.4.2)。我想不出所料,ajax函數似乎不能處理json解析本身(儘管,我必須承認,我不能確定)。

我完全處於虧損狀態,爲什麼會發生這種情況 - 任何幫助表示讚賞。

+0

當文本返回時,JSON的外觀如何?格式化相同? – 2011-02-18 21:10:02

+0

是的,它與我在webkit檢查器中查看響應時的外觀完全一樣。 – idbentley 2011-02-18 21:11:36

回答

0

應該使用Webkit inspector的調試器來代替控制檯日誌記錄,它可以顯示處於未來狀態的對象。這是導致此問題的原因,因爲列表在console.log行之後正在被代碼修剪,導致意外行爲。

1

也許我錯過了一些東西,但我注意到你的JSON是一個擁有一個數組的屬性("locations")的對象,因爲它的值。您是否嘗試過:

$.getJSON("/challenge/results", form_data, function(data){ 
    //I know console.log is bad news, just a simplification. 
    console.log('data', data.locations); 
} 
1

試試這個:

// Enables for all serialization 
jQuery.ajaxSettings.traditional = true; 

// Enables for a single serialization 
jQuery.param(stuff, true); 

// Enables for a single Ajax requeset 
$.ajax({ data: stuff, traditional: true }); 

哎,你的問題好像是有事情做與嵌套PARAM serialization.just作爲jQuery的1.4版本註釋說什麼:

查詢1.4在jQuery.param中添加了對嵌套參數序列化的支持,使用PHP推廣的方法,並由Ruby on Rails支持。例如,{foo:[「bar」,「baz」]}將被序列化爲「foo [] = bar & foo [] = baz」。

在jQuery 1.3中,{foo:[「bar」,「baz」]}被序列化爲「foo = bar & foo = baz」。但是,使用這種方法無法編碼單元素陣列。如果您需要舊的行爲,您可以通過設置傳統的Ajax設置(全局通過jQuery.ajaxSettings.traditional或通過傳統標誌在個案基礎上)來重新啓用它。