2011-03-26 95 views
2

我期待返回一些數據在軌JSON請求,我想知道,如果返回的數據格式不正確。這裏是一個縮短的例子:畸形Rails的JSON和jQuery

[{"company":{"name":"A"}},{"company":{"name":"B"}}] 

我始終認爲,在返回JSON時,它應該描述的根元素和複數,所以它應該返回更多的東西一樣:

{"companies":[{"name":"A"},{"name":"B"}]} 

這裏有問題 - 是有什麼辦法可以讓我的json以這種格式出來?那甚至是正確的格式,還是每個公司節點都需要標記?我是否必須創建自定義視圖才能獲得結果?讓jQuery以當前格式循環數據的最佳方式是什麼?現在我正在使用:

format.json { render :json => @companies.to_json() } 

要呈現結果。

預先感謝任何幫助/諮詢。

+0

還不清楚 - 是爲Rails生成第二個例子做一個自定義視圖的唯一途徑? (這是一個索引視圖) – sshefer 2011-03-26 12:07:45

回答

4

你可能尋找類似的JSend specification。在我意識到之前已經完成之前,我自己提出了這個問題,因爲我發現爲JSON服務提供標準響應容器非常有用。

這是我怎麼會重寫你的服務器響應:

format.json do 
    render :json => { 
    :status => 'success', 
    :data => { 
     :companies => @companies 
    } 
    } 
end 

有些時候你需要改變,當轉換爲JSON生成的屬性。在這種情況下,我只是用map

format.json do 
    render :json => { 
    :status => 'success', 
    :data => { 
     :companies => @companies.map do |company| 
     hash = company.attributes 
     hash['address'] = company.address 
     hash.delete('secret') 
     hash 
     end 
    } 
    } 
end 

一點更詳細的比to_json,但它更靈活,效果一樣好機架中的中間件。

+0

仍然保留每個對象的「公司」密鑰。這似乎也是,如果我只是使用「@companies」,我失去了使用to_json方法得到的特異性,不是嗎? – sshefer 2011-03-26 12:49:06

+0

@sshefer您可以通過在初始化程序中設置「ActiveRecord :: Base.include_root_in_json = false」來刪除公司密鑰。如果我需要改變屬性,我只需要使用'map'。 – 2011-03-26 19:56:00

+0

感謝亞當 - 我實際上最終在我的模型中使用「as_json」來定義默認的json響應應該如何查找,然後根據需要發送一些其他選項。這個答案與我所尋找的最接近! – sshefer 2011-03-27 14:37:10

1

兩者都是有效的JSON。不過,我同意你的意見,第二個是可取的。它不那麼多餘,因爲第一個有一個不必要的對象層並重復公司密鑰。但更微妙的好處是,第二個保護你從JSON hijacking,這是唯一可能的,當根結構是一個數組。

要循環的第一,使用例如

$.getJSON(url, functon(resp) 
{ 
    for(var i = 0; i < resp.length; i++) 
    { 
    var company = resp[i].company; 
    var name = company.name; 
    } 
}); 
+0

應RESP [I] – wildcard 2011-03-26 03:14:41

+0

謝謝,@wildcard,固定。 – 2011-03-26 03:16:10