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: Исключительный цикл привязки для свойства "CyberUser" с типом "DAL.CyberUser". Path '[0].EventRegistrations [0].CyberUser.UserLogs [0]'.
Ответы
Ответ 1
У меня была такая же проблема с коллекциями Parent/Child, и я нашел эту запись, которая решила мой случай.
Я только хотел показать список родительских элементов коллекции и не нуждался ни в каких дочерних данных, поэтому я использовал следующее, и он работал нормально:
JsonConvert.SerializeObject(ResultGroups, Formatting.None,
new JsonSerializerSettings()
{
ReferenceLoopHandling = ReferenceLoopHandling.Ignore
});
Ошибка JSON.NET Локальный цикл привязки для типа
он также ссылается на страницу с кодом Json.NET по адресу:
http://json.codeplex.com/discussions/272371
Документация: Ссылка ReferenceLoopHandling
Ответ 2
Исправление состоит в том, чтобы игнорировать ссылки на контуры, а не сериализовывать их. Это поведение указано в JsonSerializerSettings
.
Одиночный JsonConvert
с перегрузкой:
JsonConvert.SerializeObject((from a in db.Events where a.Active select a).ToList(), Formatting.Indented,
new JsonSerializerSettings() {
ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore
}
);
Если вы хотите сделать это по умолчанию, добавьте
Глобальная настройка с кодом в Application_Start()
в Global.asax.cs:
JsonConvert.DefaultSettings = () => new JsonSerializerSettings {
Formatting = Newtonsoft.Json.Formatting.Indented,
ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore
};
Ссылка: https://github.com/JamesNK/Newtonsoft.Json/issues/78
Ответ 3
Если вы используете ASP.NET Core MVC, добавьте это в метод ConfigureServices вашего файла startup.cs:
services.AddMvc()
.AddJsonOptions(
options => options.SerializerSettings.ReferenceLoopHandling =
Newtonsoft.Json.ReferenceLoopHandling.Ignore
);
Ответ 4
Это может вам помочь.
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
Ответ 5
Вы должны установить Сохранение ссылок на объекты:
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.
Ответ 6
JsonConvert.SerializeObject(ObjectName, new JsonSerializerSettings(){
PreserveReferencesHandling = PreserveReferencesHandling.Objects,
Formatting = Formatting.Indented
});
Ответ 7
Добавьте "[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; }
}