2015-11-10 48 views
2

我想序列化一個JSON對象,將它從Controller發送到視圖。儘管閱讀了很多類似的問題,但我沒有找到一個可行的解決方案。從MVC應用程序預編譯的類中序列化JSON對象

在我的情況下,我有一個List<MyType>對象,其中是一個預編譯的類。但是,當我試圖藉助序列化數據:

DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(MyType)); 

我得到了以下錯誤:

Additional information: Type MyType cannot be serialized. Consider marking it with the DataContractAttribute attribute, and marking all of its members you want serialized with the DataMemberAttribute attribute.

然而,由於這是一個預編譯的類,我不能標記成員。我該如何解決這個問題?

+0

是否有一個特別的原因,你正在使用'DataContractJsonSerializer'而不是在你的控制器上使用'Json'方法?其實,我想我應該先問一下 - 你在使用ASP.NET MVC嗎? –

+0

嗨,布萊恩!不,我只是使用了'DataContractJsonSerializer',但沒有特殊原因。你會推薦我什麼?是的,實際上,我的應用程序是一個ASP.NET MVC。我忘了提到以前:) – AdaByron

+0

看看JSON.NET庫。你應該能夠做到你想要使用這個庫中的方法。 –

回答

0

DataContractJsonSerializer使用選擇加入語義,這意味着您必須標記要使用[DataContract]屬性進行序列化的類,並標記要用[DataMember]序列化的那些類的所有成員。如果你不能改變這些類(因爲它們是預編譯的,或者你沒有另外控制源代碼),那麼用這個序列化程序就沒有太多的事情可以將數據複製到另一個類中,可以將序列化。但是,使用ASP.NET MVC,你不應該真的使用DataContractJsonSerializer--這個序列化器是爲WCF創建的,並且不是非常靈活或者用戶友好的IMO。

ASP.NET MVC框架內置基本控制器的Json方法,該方法使用後臺的JavaScriptSerializer來序列化模型對象。這個序列化器不需要標記具有屬性的類,並且因爲它已被烘焙,所以您不必在控制器方法中使用任何特殊的序列化代碼即可使用它。只需將您的方法更改爲返回JsonResult而不是ActionResult,然後將您的對象作爲最後一個業務訂單傳遞給Json方法。

例如:

[HttpGet] 
public JsonResult GetItem(int id) 
{ 
    PrecompiledClass pc = RetrieveObjectFromDatabaseOrWhatever(id); 

    return Json(pc, JsonRequestBehavior.AllowGet); 
} 

JavaScriptSerializer確實有一定的侷限性,我不會進入這裏,你可能不會在大多數正常情況下命中。但是如果你發現JavaScriptSerializer不適合你的需求,你可以切換到一個強大的第三方序列化器,如Json.Net。請參閱ASP.NET MVC and Json.NETUsing JSON.NET as the default JSON serializer in ASP.NET MVC - is it possible?以瞭解有關該選項的更多信息。

+0

哇!多麼有價值的信息。我已經做了你推薦的我,顯然我沒有得到任何錯誤,但我應該如何從視圖中獲取數據? – AdaByron

+0

你不是在視圖中使用某種AJAX(例如[jQuery](https://learn.jquery.com/ajax/))嗎?據推測,這就是導致你首先將數據序列化爲JSON的原因。如果你不熟悉這一點,那麼你可能需要通過一些關於這個主題的教程。 –

+0

是的,我用'post'方法使用AJAX來提交表單,並且我必須從'success'中檢索數據。感謝您的幫助!! – AdaByron

0

我不會推薦使用預編譯類作爲視圖模型。分離關注點和什麼。

創建一個新的類MyTypeViewModel,它將只具有UI需要知道的屬性,並將屬性從MyType映射到MyTypeViewModel。如果你想呈現一個完整的視圖 return Json(myTypeViewModel, JsonRequestBehavior.AllowGet);

return View(myTypeViewModel):再回到這樣在你的控制器的方法,如果你回到這個結果作爲API調用的一部分。

+0

謝謝Ben!不幸的是,階級選舉是這個問題的一個制約因素。另外,我需要很多類的屬性,所以創建'MyTypeViewModel'並不容易。 – AdaByron