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).
Как я могу избежать этой ошибки и успешно сериализовать родительские данные?
Ответы
Ответ 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_;
}