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

+85
22 нояб. '12 в 10:06
источник поделиться
7 ответов

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

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

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

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

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

Документация: Ссылка ReferenceLoopHandling

+160
25 нояб. '12 в 10:01
источник

Исправление состоит в том, чтобы игнорировать ссылки на контуры, а не сериализовывать их. Это поведение указано в 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

+39
16 сент. '13 в 16:37
источник

Связанные вопросы


Похожие вопросы

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

services.AddMvc()
    .AddJsonOptions(
        options => options.SerializerSettings.ReferenceLoopHandling =            
        Newtonsoft.Json.ReferenceLoopHandling.Ignore
    );
+25
18 июл. '17 в 18:30
источник

Это может вам помочь.

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

+13
10 апр. '14 в 21:27
источник

Вы должны установить Сохранение ссылок на объекты:

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.

+5
25 июл. '17 в 14:02
источник

Добавьте "[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; }
}
0
17 мая '19 в 12:33
источник

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

0
12 дек. '18 в 7:16
источник

Посмотрите другие вопросы по меткам или Задайте вопрос