"35.172.217.40 - 35.172.217.40"

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
источник поделиться
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
источник

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

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


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

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

services.AddMvc()
    .AddJsonOptions(
        options => options.SerializerSettings.ReferenceLoopHandling =            
        Newtonsoft.Json.ReferenceLoopHandling.Ignore
    );
+25
источник

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

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
источник

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

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
источник

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

0
источник

Добавьте "[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
источник

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