Сериализация ссылки объекта на JSON - PullRequest
0 голосов
/ 16 декабря 2010

Я использую ASP.NET MVC 2 с Visual Studio 2010. Многие действия моего контроллера должны сериализовать мои доменные объекты 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 является int, но Order.Customer является ссылкой на другой объект.Мне нужно создать анонимный тип, где я указываю .customerid = realorder.Customer.ID, чтобы он правильно сериализовался.

Что я хочу знать, есть ли более простой способ?Мои доменные объекты имеют много ссылок, и я хочу избегать создания анонимного типа каждый раз, когда хочу сериализовать их в JSON.

Ответы [ 2 ]

2 голосов
/ 16 декабря 2010

Просто верните соответствующий результат действия и не беспокойтесь о ручной сериализации:

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 голос
/ 16 декабря 2010

@ Endy: вы можете использовать Json.NET для сериализации вашей модели в Json. Я обычно так делаю:

  • Создание объектов DTO
  • Используйте AutoMapper для отображения между моими объекты и объекты DTO
  • Украшение некоторых атрибутов Json.NET для объектов DTO
  • Кодирование 2 вспомогательных методов для конвертации DTOs в формате Json

Вы можете получить некоторые материалы в моем посте на здесь . Надеюсь, я смогу вам помочь!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...