Можно ли вернуть SiteMap как JsonResult? - PullRequest
2 голосов
/ 18 марта 2010

У меня на контроллере очень простое действие, которое пытается вернуть мой XmlSiteMap в виде JsonResult:

public ActionResult Index()
{
    var nodes = SiteMap.Provider.RootNode;
    return new JsonResult() 
        { Data = nodes, JsonRequestBehavior = JsonRequestBehavior.AllowGet };
}

Однако, когда я вызываю Action, создается исключение InvalidOperationException:

"A circular reference was detected while serializing an object of 
   type 'System.Web.SiteMapNode'."

Есть ли способ Json сериализовать SiteMap или действительно любой объект, у которого есть дочерние элементы того же типа?

Ответы [ 3 ]

2 голосов
/ 04 июня 2010

Вот как это можно сделать с помощью Json.NET (http://json.codeplex.com). Обратите внимание на использование параметра ReferenceLoopHandling.Ignore.

using Newtonsoft.Json;

public ActionResult Index() {
  JsonSerializerSettings jsSettings = new JsonSerializerSettings();
  jsSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;

  var nodes = SiteMap.Provider.RootNode;
  return Content(JsonConvert.SerializeObject(
    new { Data = nodes }, Formatting.None, jsSettings));
}
1 голос
/ 04 июня 2010

Одна хитрость, которую вы можете использовать, когда сталкиваетесь с проблемой сериализации сложного класса в JsonResult, - это использовать LINQ и Select() для проецирования значений в перечисление по анонимному типу, содержащему только нужные вам свойства из исходного комплекса. учебный класс.

0 голосов
/ 10 мая 2010

Я ожидаю, что наличие объектов того же времени, что и у детей, не должно быть проблемой, но проблема в том, что дети ссылаются на родительский объект, и, следовательно, вы получаете циклическую ссылку.

Также возможно реализовать свой собственный сериализатор json для этого случая и явно обрабатывать циклическую ссылку, но это, вероятно, не лучшее решение.

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