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

Json Круговая ссылка была обнаружена при сериализации объекта типа

Дайте классы:

public class Parent
{
    public int id {get; set;}
    public int name {get; set;}

    public virtual ICollection<Child> children {get; set;}
}

[Table("Child")]
public partial class Child
{
    [Key]
    public int id {get; set;}
    public string name { get; set; }

    [NotMapped]
    public string nickName { get; set; }
}

И код контроллера:

List<Parent> parents = parentRepository.Get();
return Json(parents); 

Он работает на LOCALHOST, но он не работает на реальном сервере:

ОШИБКА: Json Круговая ссылка была обнаружена при сериализации объекта типа

Я выполнил поиск и нашел атрибут [ScriptIgnore], поэтому я изменил модель на

using System.Web.Script.Serialization;

public class Parent
{
    public int id {get; set;}
    public int name {get; set;}

    [ScriptIgnore]
    public virtual ICollection<Child> children {get; set;}
}

Но одна и та же ошибка возникает на реальном сервере (win2008).

Как я могу избежать этой ошибки и успешно сериализовать родительские данные?

4b9b3361

Ответ 1

Попробуйте использовать следующий код:

return Json(
    parents.Select(x => new {
        id = x.id,
        name = x.name,
        children = x.children.Select(y => new {
            // Assigment of child fields
        })
    })); 

... или вам нужны только родительские свойства:

return Json(
    parents.Select(x => new {
        id = x.id,
        name = x.name
    })); 

На самом деле это не решение проблемы, но это обычное обходное решение при сериализации DTO...

Ответ 2

У меня была аналогичная проблема, и я также не смог решить основную проблему. Я полагаю, что сервер использует dll, отличную от localhost, для преобразования в json через json.encode.

Я поставил вопрос и свое решение здесь Круговая ссылка была обнаружена при сериализации с помощью Json.Encode

Я решил с mvchelper.

Ответ 3

Вы можете использовать этот код и не использовать функцию выделения расширения для фильтрации столбца.

var list = JsonConvert.SerializeObject(Yourmodel,
    Formatting.None,
    new JsonSerializerSettings() {
        ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore
});
return list;

Ответ 4

Я использую исправление, потому что использование нокаута в представлениях MVC5.

В действии

return Json(ModelHelper.GetJsonModel<Core_User>(viewModel));

функция

   public static TEntity GetJsonModel<TEntity>(TEntity Entity) where TEntity : class
    {
        TEntity Entity_ = Activator.CreateInstance(typeof(TEntity)) as TEntity;
        foreach (var item in Entity.GetType().GetProperties())
        {
            if (item.PropertyType.ToString().IndexOf("Generic.ICollection") == -1 && item.PropertyType.ToString().IndexOf("SaymenCore.DAL.") == -1)
                item.SetValue(Entity_, Entity.GetPropValue(item.Name));
        }
        return Entity_;  
    }