序列化对象对JSON的引用

时间:2010-12-16 09:33:05

标签: asp.net-mvc json

我在Visual Studio 2010中使用ASP.NET MVC 2.我的许多控制器操作都需要将我的POCO域对象序列化为JSON。顺便说一下,我使用nhibernate作为我的ORM。

我正在使用System.Web.Script.Serialization.JavaScriptSerializer。它很好地处理简单属性(int,string,date等),但它跳过引用属性,所以我必须将我的对象映射到匿名类型,然后将这个匿名类型提供给JavaScriptSerializer,如下所示:

Public Class Order
    Public Property ID As Integer
    Public Property Customer As User
End Class

Function Details() As ActionResult
    Dim realorder As Order = DB.Get(Of Order)(id)
    Dim flattenedorder As New With {
        .id = realorder.ID, .customerid = realorder.Customer.ID}
    Dim encoder = New System.Web.Script.Serialization.JavaScriptSerializer()
    ViewData("order") = encoder.Serialize(flattenedorder)
    Return View()
End Function

在上面的示例中,Order.ID是一个i​​nt,但Order.Customer是对另一个对象的引用。我必须创建一个匿名类型,我指定.customerid = realorder.Customer.ID,所以它被正确序列化。

我想知道的是,有更简单的方法吗?我的域对象有很多引用,我想避免每次我想将它们序列化为JSON时创建匿名类型。

2 个答案:

答案 0 :(得分:2)

只需返回appropriate action result,不要打扰手动序列化:

Function Details() As ActionResult
    Dim realorder As Order = DB.Get(Of Order)(id)
    Dim flattenedorder As New With {
        .id = realorder.ID, .customerid = realorder.Customer.ID}
    Return Json(flattenedorder, JsonRequestBehavior.AllowGet)
End Function

就引用而言,问题源于您将域对象返回到视图而不是使用视图模型。不使用专门针对给定视图定制的视图模型是我在人们使用ASP.NET MVC时看到的最基本的错误之一。首先,定义POCO对象,它们只代表给定视图所需的域模型部分,然后您可以使用AutoMapper在模型和视图模型之间进行转换。

答案 1 :(得分:1)

@Endy:您可以使用Json.NET将您建模的序列化为Json。我通常这样做:

  • 构建DTO对象
  • 使用AutoMapper在我的地图之间进行映射 实体和DTO对象
  • 在DTO对象上装饰一些Json.NET属性
  • 编码2个辅助方法进行转换 DTO到Json格式

您可以在here的帖子中找到一些内容。希望我能帮到你!