我正在尝试序列化JSON对象,以将其从Controller发送到View。尽管阅读了大量类似的问题,但我找不到一个效果很好的解决方案。
就我而言,我有一个List<MyType>
对象,其中是一个预编译的类。但是,当我尝试通过以下方式序列化数据时:
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(MyType));
我收到以下错误:
其他信息:类型
MyType
不能 序列化。考虑使用DataContractAttribute标记它 属性,并标记要用序列化的所有成员 DataMemberAttribute属性。
但是,由于它是预编译的类,我无法标记成员。我怎么解决这个问题?
答案 0 :(得分:0)
我不建议使用预编译类作为视图模型。分离关注点和诸如此类的东西。
创建一个新类MyTypeViewModel,它只包含UI需要知道的属性,并将属性从MyType映射到MyTypeViewModel。如果您将此结果作为API调用的一部分返回,则在控制器方法中返回如下所示:
return Json(myTypeViewModel, JsonRequestBehavior.AllowGet);
或return View(myTypeViewModel)
如果您想渲染整个视图。
答案 1 :(得分:0)
DataContractJsonSerializer
使用opt-in语义,这意味着您必须使用[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.NET和Using JSON.NET as the default JSON serializer in ASP.NET MVC - is it possible?以了解有关该选项的更多信息。