我正在尝试序列化一个 JSON 对象以将其从 Controller 发送到 View 。尽管阅读了大量类似的问题,但我没有找到行之有效的解决方案。
在我的例子中,我有一个 List<MyType>
object,其中是一个预编译的类。但是当我尝试通过以下方式序列化数据时:
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.
但是,因为是预编译类,所以不能标记成员。我该如何解决这个问题?
最佳答案
DataContractJsonSerializer
使用选择加入语义,这意味着您必须使用 [DataContract]
属性标记要序列化的类,并使用 [ 标记要序列化的那些类的所有成员数据成员]
。如果您无法更改这些类(因为它们是预编译的或者您无法控制源代码),那么除了将数据复制到另一个 可以被连载。但是,对于 ASP.NET MVC,您实际上不应该使用 DataContractJsonSerializer
——这个序列化程序是为 WCF 创建的并且不是很灵活或用户友好,IMO。
ASP.NET MVC 框架有一个 Json
基本 Controller 中内置的方法,它使用 JavaScriptSerializer
在幕后序列化您的模型对象。这个序列化器不需要用属性标记类,并且因为它是内置的,所以您不必将任何特殊的序列化代码放入您的 Controller 方法中即可使用它。只需更改您的方法以返回 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.NET和 Using JSON.NET as the default JSON serializer in ASP.NET MVC - is it possible?了解有关该选项的更多信息。
关于c# - 从 MVC 应用程序中的预编译类序列化 JSON 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33640339/