Подтвердить что ты не робот

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

4b9b3361

Ответ 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
    );

Ответ 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; }
}