web-dev-qa-db-ja.com

JSON.Net自己参照ループが検出されました

私のウェブサイト用のmssqlデータベースは4つのテーブル内にあります。

これを使用する場合:

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:タイプ「DAL.Cyber​​User」のプロパティ「Cyber​​User」で自己参照ループが検出されました。パス '[0] .EventRegistrations [0] .Cyber​​User.UserLogs [0]'。

91
Kovu

親/子コレクションで同じ問題が発生しましたが、私の投稿を解決した投稿を見つけました。親コレクションアイテムのリストのみを表示したかったため、子データは必要ありませんでした。そのため、以下を使用し、正常に機能しました。

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

JSON.NETエラータイプの自己参照ループが検出されました

また、次のJson.NET codeplexページも参照しています。

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

ドキュメント:ReferenceLoopHandling設定

修正は、ループ参照を無視し、それらをシリアル化しないことです。この動作は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()のコードでGlobal Settingを追加します。

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

リファレンス: https://github.com/JamesNK/Newtonsoft.Json/issues/78

39
smockle

ASP.NET Core MVCを使用している場合、startup.csファイルのConfigureServicesメソッドにこれを追加します。

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

これはあなたを助けるかもしれません。

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

13
ddagsan

保存オブジェクト参照を設定する必要があります。

var jsonSerializerSettings = new JsonSerializerSettings
{
    PreserveReferencesHandling = PreserveReferencesHandling.Objects
};

次に、クエリをvar q = (from a in db.Events where a.Active select a).ToList();のように呼び出します

string jsonStr = Newtonsoft.Json.JsonConvert.SerializeObject(q, jsonSerializerSettings);

参照: https://www.newtonsoft.com/json/help/html/PreserveObjectReferences.htm

5
Cyrus

「[JsonIgnore]」をモデルクラスに追加します

{
  public Customer()
  {
    Orders = new Collection<Order>();
  }

public int Id { get; set; }
public string Name { get; set; }
public string Surname { get; set; }

[JsonIgnore]
public ICollection<Order> Orders { get; set; }
}
2
Samet Sunman

JsonConvert.SerializeObject(ObjectName, new JsonSerializerSettings(){ PreserveReferencesHandling = PreserveReferencesHandling.Objects, Formatting = Formatting.Indented });

0
user3824027