2010-03-18 59 views
2

我已經得到了我的控制很簡單的行動應該試圖返回我的XmlSiteMap作爲JsonResult:是否有可能將SiteMap作爲JsonResult返回?

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

然而,當我打電話的動作,則會引發InvalidOperationException:

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

有沒有辦法讓Json序列化一個SiteMap,或者實際上任何有相同類型子對象的對象?

+0

我沒有親自使用它,但我相信JSON.NET(http://www.codeplex.com/Json)應該能夠處理循環依賴。 – richeym 2010-03-18 12:03:06

+0

謝謝,我會給JSON.NET一個去。 – 2010-03-19 11:37:13

+0

我的回答有幫助嗎? – JustinStolle 2010-06-11 22:24:27

回答

0

我期望有與兒童同時的對象不應該是一個問題,但問題是,孩子引用父對象,因此你得到一個循環引用。

也可以爲這種情況實現自己的json序列化程序,並顯式處理循環引用,但這可能不是最佳解決方案。

2

以下是使用Json.NET(http://json.codeplex.com)完成此操作的方法。請注意使用ReferenceLoopHandling.Ignore設置。當你打序列化一個複雜的類的JsonResult的問題,您可以使用

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)); 
} 
+0

+1。 Json.NET的性能遠遠好於內置的串行器,並提供了更多的自定義選項。 – 2011-05-26 22:18:03

1

一個竅門是使用LINQ和Select()超過只包含你從需要的屬性匿名類型項目的值,以枚舉原來的複雜類。

+0

好點,謝謝。 – 2010-06-04 10:49:15

相關問題