2011-03-29 55 views
2

好吧,所以我使用的是MVC 3,它非常適合將JSON數據集反序列化爲傳遞給我的控制器操作的強類型對象。不幸的是,我還沒有找到一個更具動態的解決方案。如何在MVC 3控制器中獲取動態創建的Json數據集?

是否內置Json反序列化和類支持「未定義」屬性集?例如,假設我有一些固定的數據,如姓名和年齡,但我也想傳遞一個動態創建的評級列表,用戶可以在其中輸入(或選擇)電影並在表中設置評分值。

模型數據結構可以是這樣的:

public class UserRatings 
{ 
    public string Name { get; set; } 
    public int Age { get; set; } 
    public Dictionary<string,int> Ratings { get; set; } 
} 

但是假設我的Json數據集看起來像這樣的javascript:

var data = { Name: name, Age: age, Ratings: rating }; 

凡等級變量是一個動態構造對象由電影的名稱(或編號)作爲關鍵字和評級編號組成。在控制器動作中自然地反序列化它將不會成功,因爲它不理解評級到相當複雜的字典對象的映射。但是有沒有一個通用的Json集合,我可以用它作爲中間格式的評分?

我已經嘗試使用JavaScript對象作爲JSON字符串,只是發送一個字符串,但我無法找到一個「工廠」或可以使C#中的JSON結構的東西,我可以迭代得到數據輸出。看起來在這方面JsonJsonResult並不幫助我。基本上我怎麼能在MVC中使用內置的Json支持來對自己的通用Json集合對象進行反序列化?

+0

只是想評論一下,我的解決方案到目前爲止是使評級爲字符串類型,並在客戶端上對評級對象執行JSON.stringify並將其作爲一個字符串屬性發送。然後它們全部直接映射到POCO中。然後剝離評級字符串中的所有轉義字符,該字符串以json字符串留給我,以便JavaScriptSerialiser能夠轉換爲Dictionary ,我可以在其中遍歷它們並更新數據庫。它有點混亂,但它有效。任何建議,不勝感激。 – Johncl 2011-03-30 12:31:24

+0

相關/愚弄: http://stackoverflow.com/questions/5022958/passing-dynamic-json-object-to-c-sharp-mvc-controller http:// stackoverflow。com/questions/10787679/passing-unstructured-json-between-jquery-and-mvc-controller-actions – 2013-01-07 10:14:05

回答

4

您可以使用JavaScriptSerializerDataContractSerializer與某些ActionFilters。他們是非常靈活的

+0

謝謝。 JavaScriptSerializer有一個名爲DeserializeObject的方法,在我的情況下實際上創建了一個Json數據的Dictionary ,它極大地簡化了整個過程!我想我希望這是內置反序列化程序的一部分,因爲創建相同類型的字典不適用於所討論的複雜屬性。 – Johncl 2011-03-29 13:51:13

0

這裏面有我喜歡使用是整潔的另一種選擇......(我們消除了獲取數據的從請求流步驟)

下面是一個代碼示例

Cat catObj = new Cat(); 

if (TryUpdateModel<Cat>(catObj)) 
{ 
//do stuff 
} 
else 
{ 
//invalid input 
} 

TryUpdateModel駐留在控制器名稱空間中,因此不需要添加任何其他引用。

如果你只需要發送中,你可以使用下面的代碼塊獲取其請求的一部分的JSON(你也可以從Request.Form獲得它)

using (StreamReader reader = new StreamReader(Request.InputStream)) 
{ 
    var inputJson = reader.ReadToEnd(); 
} 
+0

好吧,所以這將是爲了避免有一個簡單的字符串屬性來包含我的情況下的所有動態json數據?但我仍然需要一些方法來獲得包含我的動態列表的jason塊,以及如何在動作中執行此操作的任何想法? – Johncl 2011-03-30 10:55:18

+0

@Johncl:更新了答案...看一看 – Mulki 2011-03-30 11:18:01

+0

但正如你可能從我的例子中看到的,我發送了一個json對象,它包含一些應直接映射到定義良好的對象的屬性的屬性,以及一個屬性包含一個通用名稱 - 值映射。是否有一個數據類型,我可以使用該屬性,將填充該屬性的原始json數據? Atm我需要發送一個json編碼的字符串作爲一個數據類型,並在使用JavaScriptSerializer獲取字典之前使用這個字符串。如果可能的話,避免使用stringified-json-hack-in-json會很好。 – Johncl 2011-03-30 12:20:02

相關問題