私のウェブサイト用の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.CyberUser」のプロパティ「CyberUser」で自己参照ループが検出されました。パス '[0] .EventRegistrations [0] .CyberUser.UserLogs [0]'。
親/子コレクションで同じ問題が発生しましたが、私の投稿を解決した投稿を見つけました。親コレクションアイテムのリストのみを表示したかったため、子データは必要ありませんでした。そのため、以下を使用し、正常に機能しました。
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
ASP.NET Core MVCを使用している場合、startup.csファイルのConfigureServicesメソッドにこれを追加します。
services.AddMvc()
.AddJsonOptions(
options => options.SerializerSettings.ReferenceLoopHandling =
Newtonsoft.Json.ReferenceLoopHandling.Ignore
);
これはあなたを助けるかもしれません。
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
保存オブジェクト参照を設定する必要があります。
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
「[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; }
}
JsonConvert.SerializeObject(ObjectName, new JsonSerializerSettings(){ PreserveReferencesHandling = PreserveReferencesHandling.Objects, Formatting = Formatting.Indented });