149

4 つのテーブル内に、Web サイト用の mssql データベースがあります。

これを使用する場合:

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]'.

4

11 に答える 11

294

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

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

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

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

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

ドキュメント:ReferenceLoopHandling設定

于 2012-11-25T10:01:30.490 に答える
52

修正は、ループ参照を無視し、シリアル化しないことです。この動作は で指定されてい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

于 2013-09-16T16:37:18.193 に答える
41

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

services.AddMvc()
    .AddJsonOptions(
        options => options.SerializerSettings.ReferenceLoopHandling =            
        Newtonsoft.Json.ReferenceLoopHandling.Ignore
    );
于 2017-07-18T18:30:49.903 に答える
13

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

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

于 2014-04-10T21:27:10.600 に答える
1

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

于 2018-12-12T07:16:37.907 に答える
1

JsonSerializer インスタンスは、参照ループを無視するように構成できます。次のように、この関数を使用すると、json シリアル化されたオブジェクトのコンテンツを含むファイルを保存できます。

    public static void SaveJson<T>(this T obj, string FileName)
    {
   
       JsonSerializer serializer = new JsonSerializer();
        serializer.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
        using (StreamWriter sw = new StreamWriter(FileName))
        {
            using (JsonWriter writer = new JsonTextWriter(sw))
            {
                writer.Formatting = Formatting.Indented;
                serializer.Serialize(writer, obj);
            }
        }
    }
于 2020-09-03T18:52:16.657 に答える