我的控制器上有一个非常简单的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,或者确实有任何具有相同类型子元素的对象?
答案 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序列化程序并显式处理循环引用,但这可能不是最佳解决方案。