【问题标题】:Is it possible to return a SiteMap as a JsonResult?是否可以将 SiteMap 作为 JsonResult 返回?
【发布时间】:2011-01-28 22:57:51
【问题描述】:

我的控制器上有一个非常简单的操作,它试图将我的 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,或者任何具有相同类型子对象的对象?

【问题讨论】:

  • 我个人没用过,但相信 JSON.NET (codeplex.com/Json) 应该能够处理循环依赖。
  • 谢谢,我会试试 JSON.NET。

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


【解决方案1】:

以下是使用 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。 Json.NET 的性能远胜于内置的序列化程序,并提供了更多的自定义选项。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    我希望拥有与子对象同时存在的对象应该不是问题,但问题是子对象引用父对象,因此您会得到循环引用。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-25
      • 2023-03-20
      • 1970-01-01
      相关资源
      最近更新 更多