是否可以将SiteMap作为JsonResult返回?

时间:2010-03-18 09:58:51

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

我的控制器上有一个非常简单的Action,它试图将我的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 个答案:

答案 0 :(得分:2)

以下是使用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 :(得分:1)

当您遇到将复杂类序列化为JsonResult的问题时,可以使用的一个技巧是使用LINQ和Select()将值投影到匿名类型上的枚举,该类型仅包含您需要的属性原始的复杂类。

答案 2 :(得分:0)

我希望拥有与孩子同时出现的对象应该不是问题,但问题是孩子们引用父对象,因此你得到一个循环引用。

也可以为这种情况实现自己的json序列化程序并显式处理循环引用,但这可能不是最佳解决方案。