4 개의 테이블 내에 내 웹 사이트에 대한 mssql 데이터베이스가 있습니다.
이것을 사용할 때 :
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 : ‘DAL.CyberUser’유형의 ‘CyberUser’속성에 대해 자체 참조 루프가 감지되었습니다. 경로 ‘[0] .EventRegistrations [0] .CyberUser.UserLogs [0]’.
답변
부모 / 자식 컬렉션에 대해 동일한 문제가 발생했으며 해당 게시물이 내 사례를 해결했습니다. 부모 컬렉션 항목 목록 만 표시하고 싶었고 자식 데이터가 필요하지 않았으므로 다음을 사용했으며 제대로 작동했습니다.
JsonConvert.SerializeObject(ResultGroups, Formatting.None,
new JsonSerializerSettings()
{
ReferenceLoopHandling = ReferenceLoopHandling.Ignore
});
JSON.NET 오류 자체 참조 루프가 유형에 대해 감지되었습니다.
또한 다음 위치의 Json.NET codeplex 페이지를 참조합니다.
http://json.codeplex.com/discussions/272371
답변
수정 사항은 루프 참조를 무시하고 직렬화하지 않는 것입니다. 이 동작은 JsonSerializerSettings
.
JsonConvert
과부하가있는 싱글 :
JsonConvert.SerializeObject((from a in db.Events where a.Active select a).ToList(), Formatting.Indented,
new JsonSerializerSettings() {
ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore
}
);
이것을 기본 동작으로 만들려면 Global.asax.cs에 코드가 있는 전역 설정 을 추가합니다
Application_Start()
.
JsonConvert.DefaultSettings = () => new JsonSerializerSettings {
Formatting = Newtonsoft.Json.Formatting.Indented,
ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore
};
답변
ASP.NET Core MVC를 사용하는 경우 다음을 startup.cs 파일의 ConfigureServices 메서드에 추가합니다.
services.AddMvc()
.AddJsonOptions(
options => options.SerializerSettings.ReferenceLoopHandling =
Newtonsoft.Json.ReferenceLoopHandling.Ignore
);
답변
이것은 당신을 도울 수 있습니다.
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
답변
객체 참조 보존을 설정해야합니다.
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
답변
모델 클래스에 “[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; }
}
답변
Dot.Net Core 3.1을 사용하고 있으며
“Newtonsoft.Json.JsonSerializationException : 속성에 대해 자체 참조 루프가 감지되었습니다.”
쉬운 참조가 될 것이므로이 질문에 이것을 추가하고 있습니다. Startup.cs 파일에서 다음을 사용해야합니다.
services.AddControllers()
.AddNewtonsoftJson(options =>
{
// Use the default property (Pascal) casing
options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
});