从MVC应用程序

时间:2015-11-10 21:52:58

标签: c# json asp.net-mvc serialization

我正在尝试序列化JSON对象,以将其从Controller发送到View。尽管阅读了大量类似的问题,但我找不到一个效果很好的解决方案。

就我而言,我有一个List<MyType>对象,其中是一个预编译的类。但是,当我尝试通过以下方式序列化数据时:

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

我收到以下错误:

  

其他信息:类型MyType不能   序列化。考虑使用DataContractAttribute标记它   属性,并标记要用序列化的所有成员   DataMemberAttribute属性。

但是,由于它是预编译的类,我无法标记成员。我怎么解决这个问题?

2 个答案:

答案 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.NETUsing JSON.NET as the default JSON serializer in ASP.NET MVC - is it possible?以了解有关该选项的更多信息。