JSON.Net Обнаружен собственный цикл привязки

У меня есть firebase database 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]’.

У меня была такая же проблема с коллекциями родителей / детей, и я нашел эту должность, которая решила мое дело. Я только хотел показать список родительских элементов коллекции и не нуждался ни в одном из дочерних данных, поэтому я использовал следующее, и он работал нормально:

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

Ошибка JSON.NET Локальный цикл привязки для типа

он также ссылается на страницу с кодом Json.NET по адресу:

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

Документация: настройка ReferenceLoopHandling

Исправление состоит в том, чтобы игнорировать ссылки на цикл, а не сериализовывать их. Это поведение указано в JsonSerializerSettings .

Single 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

Если вы используете ASP.NET Core MVC, добавьте это в метод ConfigureServices вашего файла startup.cs:

 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 }; 

http://www.newtonsoft.com/json/help/html/PreserveObjectReferences.htm

  • Как изменить имена свойств при сериализации с помощью Json.net?
  • EF 4.1 - Code First - Ошибка серийной ссылки JSON
  • Есть ли у .NET 4 встроенный сериализатор / десериализатор JSON?
  • Ошибка JSON.NET Локальный цикл привязки для типа
  • Преобразование записей в последовательную форму данных для отправки по HTTP
  • Java: объект для байта и байт для конвертера объектов (для Tokyo Cabinet)
  • Пользовательский серализатор Gson для одной переменной (из многих) в объекте с использованием TypeAdapter
  • Информация о сериализации типов кеша Json.NET?
  • Невозможно десериализовать lambda
  • Как превратить объект C # в строку JSON в .NET?
  • Получение ServiceStack для сохранения информации о типе
  • Давайте будем гением компьютера.