질문 : JSON.NET 오류 자체 참조 루프가 유형에 대해 감지되었습니다.
Entity Data Model .edmx에서 자동으로 생성 된 POCO 클래스를 직렬화하려고했습니다.
JsonConvert.SerializeObject
다음과 같은 오류가 발생했습니다.
오류 System.data.entity 유형에 대한 자체 참조 루프가 발견되었습니다.
이 문제를 어떻게 해결합니까?
답변
수정 1: 전체적으로 순환 참조 무시
(나는 다른 많은 사람들과 마찬가지로 이것을 선택 / 시도했습니다)
json.net serializer에는 순환 참조를 무시하는 옵션이 있습니다. WebApiConfig.cs
파일에 다음 코드를 넣으십시오.
config.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling
= Newtonsoft.Json.ReferenceLoopHandling.Ignore;
간단한 수정은 serializer가 루프를 유발하는 참조를 무시하도록 만듭니다. 그러나 다음과 같은 제한 사항이 있습니다.
- 데이터는 루핑 참조 정보를 잃습니다.
- 수정 사항은 JSON.net에만 적용됩니다.
- 깊은 참조 체인이있는 경우 참조 수준을 제어 할 수 없습니다.
API가 아닌 ASP.NET 프로젝트에서이 수정을 사용하려면 위의 줄을 Global.asax.cs
추가 할 수 있지만 먼저 다음을 추가하십시오.
var config = GlobalConfiguration.Configuration;
.Net Core 프로젝트에서 이것을 사용 Startup.cs
를 다음과 같이 변경할 수 있습니다.
var mvc = services.AddMvc(options =>
{
...
})
.AddJsonOptions(x => x.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore);
수정 2: 전체적으로 순환 참조 보존
이 두 번째 수정 사항은 첫 번째 수정 사항과 유사합니다. 코드를 다음과 같이 변경하십시오.
config.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling
= Newtonsoft.Json.ReferenceLoopHandling.Serialize;
config.Formatters.JsonFormatter.SerializerSettings.PreserveReferencesHandling
= Newtonsoft.Json.PreserveReferencesHandling.Objects;
이 설정을 적용하면 데이터 모양이 변경됩니다.
[
{
"$id":"1",
"Category":{
"$id":"2",
"Products":[
{
"$id":"3",
"Category":{
"$ref":"2"
},
"Id":2,
"Name":"Yogurt"
},
{
"$ref":"1"
}
],
"Id":1,
"Name":"Diary"
},
"Id":1,
"Name":"Whole Milk"
},
{
"$ref":"3"
}
]
$ id 및 $ ref는 모든 참조를 유지하고 개체 그래프 수준을 평평하게 만들지 만 클라이언트 코드는 데이터를 사용하기 위해 모양 변경을 알아야하며 JSON.NET serializer에만 적용됩니다.
수정 3: 참조 특성 무시 및 유지
이 수정은 모델 또는 속성 수준에서 직렬화 동작을 제어하기 위해 모델 클래스의 특성을 장식하는 것입니다. 속성을 무시하려면 :
public class Category
{
public int Id { get; set; }
public string Name { get; set; }
[JsonIgnore]
[IgnoreDataMember]
public virtual ICollection<Product> Products { get; set; }
}
JsonIgnore는 JSON.NET 용이고 IgnoreDataMember는 XmlDCSerializer 용입니다. 참조를 유지하려면 :
// Fix 3
[JsonObject(IsReference = true)]
public class Category
{
public int Id { get; set; }
public string Name { get; set; }
// Fix 3
//[JsonIgnore]
//[IgnoreDataMember]
public virtual ICollection<Product> Products { get; set; }
}
[DataContract(IsReference = true)]
public class Product
{
[Key]
public int Id { get; set; }
[DataMember]
public string Name { get; set; }
[DataMember]
public virtual Category Category { get; set; }
}
JsonObject(IsReference = true)]
는 JSON.NET 용이고 [DataContract(IsReference = true)]
는 XmlDCSerializer 용입니다. 참고 : DataContract
를 적용한 후 직렬화하려는 속성 DataMember
를 추가해야합니다.
속성은 json 및 xml serializer 모두에 적용 할 수 있으며 모델 클래스에 대한 더 많은 제어를 제공합니다.
출처 : https://stackoverflow.com/questions/7397207/json-net-error-self-referencing-loop-detected-for-type
'개발관련 > other' 카테고리의 다른 글
Haskell은 현실 세계에서 무엇에 사용되는가? (0) | 2021.09.28 |
---|---|
deep copy와 shallow copy의 차이점 (0) | 2021.09.28 |
Node Sass 오류 "couldn't find a binding for your current environment" (0) | 2021.09.27 |
React.js 인라인 스타일 모범 사례 (0) | 2021.09.27 |
Chrome 자동 완성 사용 중지 (0) | 2021.09.27 |