[c#] JSON.Net 자체 참조 루프 감지

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

문서 : ReferenceLoopHandling 설정


답변

수정 사항은 루프 참조를 무시하고 직렬화하지 않는 것입니다. 이 동작은 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
};

참조 : https://github.com/JamesNK/Newtonsoft.Json/issues/78


답변

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;
                });