2012-11-22 116 views
59

我在我的網站有4個表格的mssql數據庫。JSON.Net檢測到自回參考循環

當我使用這個:

public static string GetAllEventsForJSON() 
{ 
    using (CyberDBDataContext db = new CyberDBDataContext()) 
    { 
     return JsonConvert.SerializeObject((from a in db.Events where a.Active select a).ToList(), new JavaScriptDateTimeConverter()); 
    } 
} 

以下錯誤代碼結果:

Newtonsoft.Json.JsonSerializationException: Self referencing loop detected for property 'CyberUser' with type 'DAL.CyberUser'. Path '[0].EventRegistrations[0].CyberUser.UserLogs[0]'.

+2

可能重複的[JSON.NET錯誤自檢參考循環類型檢測](http://stackoverflow.com/questions/7397207/json-net-error-self-referencing-loop-detected-for-type) –

+0

會如果是,請您將我的答案標記爲正確? @Kovu –

+0

可能重複的[實體框架自我引用循環檢測](https://stackoverflow.com/questions/19467673/entity-framework-self-referencing-loop-detected) –

回答

123

我剛剛與父/子集同樣的問題,發現後已解決了我案件。 我只是想表明父集合項目的名單,並沒有需要任何的子數據的,因此我用下面的,它工作得很好:

JsonConvert.SerializeObject(ResultGroups, Formatting.None, 
         new JsonSerializerSettings() 
         { 
          ReferenceLoopHandling = ReferenceLoopHandling.Ignore 
         }); 

JSON.NET Error Self referencing loop detected for type

也referes到Json.NET CodePlex網站頁面在:

http://json.codeplex.com/discussions/272371

文檔:ReferenceLoopHandling setting

+3

非常感謝,兄弟。 –

30

修正是忽略循環引用而不是序列化它們。此行爲在JsonSerializerSettings中指定。

JsonConvert與過載:

JsonConvert.SerializeObject((from a in db.Events where a.Active select a).ToList(), Formatting.Indented, 
    new JsonSerializerSettings() { 
     ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore 
    } 
); 

如果你想使這個默認的行爲,在Global.asax.cs中添加 全球使用代碼設置Application_Start()

JsonConvert.DefaultSettings =() => new JsonSerializerSettings { 
    Formatting = Newtonsoft.Json.Formatting.Indented, 
    ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore 
}; 

參考:https://github.com/JamesNK/Newtonsoft.Json/issues/78

+2

用這個序列化需要很長的時間 – daniel

12

這可能對你有所幫助。

public MyContext() : base("name=MyContext") 
{ 
    Database.SetInitializer(new MyContextDataInitializer()); 
    this.Configuration.LazyLoadingEnabled = false; 
    this.Configuration.ProxyCreationEnabled = false; 
} 

http://code.msdn.microsoft.com/Loop-Reference-handling-in-caaffaf7

+3

如果你也使用異步方法,這是最好的方法。這可能是一個真正的痛苦,但它解決了很多其他問題(包括這個問題),並且可以更高性能,因爲您只查詢要使用的內容。 –

+0

在您的xyz.edmx中,打開默認情況下將隱藏的xyz.Context.vb文件。這將有'code'公共Sub New()Mybase.New(「name = EntityConName」)End Sub'code'。現在之前結束小組添加'代碼'Me.Configuration.LazyLoadingEnabled =假 Me.Configuration.ProxyCreationEnabled = False'代碼'這將擺脫'自我參考循環'錯誤在你的json輸出從webapi。 – Venkat

8

如果使用ASP.NET MVC的核心,它添加到您的startup.cs文件的ConfigureServices方法:

services.AddMvc() 
    .AddJsonOptions(
     options => options.SerializerSettings.ReferenceLoopHandling =    
     Newtonsoft.Json.ReferenceLoopHandling.Ignore 
    );