Json의 PreserveReferencesHandling과 ReferenceLoopHandling의 차이점은 무엇입니까?인터넷?
다음 코드화된 WebAPI 어플리케이션샘플을 보고 있습니다.
json.SerializerSettings.PreserveReferencesHandling
= Newtonsoft.Json.PreserveReferencesHandling.Objects;
코드화된 다른 코드:
json.SerializerSettings.ReferenceLoopHandling
= Newtonsoft.Json.ReferenceLoopHandling.Ignore;
왜 각각이 선택되었는지 설명하지 않는다.WebAPI를 처음 접하는 저는 WebAPI에 대해 잘 모르기 때문에 어떤 차이점이 있는지, 왜 다른 것을 사용해야 하는지 간단하게 설명해 주실 수 있을까요?
이러한 설정은 예를 들어 설명하는 것이 가장 좋습니다.예를 들어, 우리는 회사의 직원 계층을 대표하고 싶다고 합시다.그래서 우리는 다음과 같은 간단한 수업을 만듭니다.
class Employee
{
public string Name { get; set; }
public List<Employee> Subordinates { get; set; }
}
이 회사는 지금까지 앤젤라, 밥, 찰스 등 3명의 직원만 있는 작은 회사입니다.안젤라는 사장이고 밥과 찰스는 그녀의 부하직원이다.이 관계를 설명하는 데이터를 설정합니다.
Employee angela = new Employee { Name = "Angela Anderson" };
Employee bob = new Employee { Name = "Bob Brown" };
Employee charles = new Employee { Name = "Charles Cooper" };
angela.Subordinates = new List<Employee> { bob, charles };
List<Employee> employees = new List<Employee> { angela, bob, charles };
JSON에 직원 명단을 연재하면...
string json = JsonConvert.SerializeObject(employees, Formatting.Indented);
Console.WriteLine(json);
...다음 출력을 얻을 수 있습니다.
[
{
"Name": "Angela Anderson",
"Subordinates": [
{
"Name": "Bob Brown",
"Subordinates": null
},
{
"Name": "Charles Cooper",
"Subordinates": null
}
]
},
{
"Name": "Bob Brown",
"Subordinates": null
},
{
"Name": "Charles Cooper",
"Subordinates": null
}
]
아직까지는 좋아.그러나 밥과 찰스에 대한 정보는 JSON에서 반복되고 있다는 것을 알 수 있습니다.이는 이들을 나타내는 오브젝트가 직원 메인 리스트와 안젤라의 부하 리스트 모두에 의해 참조되기 때문입니다.지금은 그게 괜찮을지도 몰라.
이제 부하 직원 외에 각 직원의 상사를 추적하는 방법도 생각해 보겠습니다.그래서 우리는 우리의Employee
추가할 모델Supervisor
속성...
class Employee
{
public string Name { get; set; }
public Employee Supervisor { get; set; }
public List<Employee> Subordinates { get; set; }
}
셋업 코드에 몇 줄 더 추가하여 찰스와 밥이 안젤라에게 보고하는 것을 나타냅니다.
Employee angela = new Employee { Name = "Angela Anderson" };
Employee bob = new Employee { Name = "Bob Brown" };
Employee charles = new Employee { Name = "Charles Cooper" };
angela.Subordinates = new List<Employee> { bob, charles };
bob.Supervisor = angela; // added this line
charles.Supervisor = angela; // added this line
List<Employee> employees = new List<Employee> { angela, bob, charles };
하지만 지금 우리는 약간의 문제가 있다.오브젝트 그래프에 참조 루프가 포함되어 있기 때문입니다(예:angela
레퍼런스bob
하는 동안에bob
레퍼런스angela
)를 취득합니다.JsonSerializationException
직원 명단을 연재하려고 할 때요이 문제를 회피할 수 있는 방법 중 하나는ReferenceLoopHandling
로.Ignore
다음과 같습니다.
JsonSerializerSettings settings = new JsonSerializerSettings
{
ReferenceLoopHandling = ReferenceLoopHandling.Ignore,
Formatting = Formatting.Indented
};
string json = JsonConvert.SerializeObject(employees, settings);
이 설정이 적용되면 다음 JSON이 생성됩니다.
[
{
"Name": "Angela Anderson",
"Supervisor": null,
"Subordinates": [
{
"Name": "Bob Brown",
"Subordinates": null
},
{
"Name": "Charles Cooper",
"Subordinates": null
}
]
},
{
"Name": "Bob Brown",
"Supervisor": {
"Name": "Angela Anderson",
"Supervisor": null,
"Subordinates": [
{
"Name": "Charles Cooper",
"Subordinates": null
}
]
},
"Subordinates": null
},
{
"Name": "Charles Cooper",
"Supervisor": {
"Name": "Angela Anderson",
"Supervisor": null,
"Subordinates": [
{
"Name": "Bob Brown",
"Subordinates": null
}
]
},
"Subordinates": null
}
]
JSON을 조사하면 이 설정이 어떻게 동작하는지 명확히 알 수 있습니다.시리얼라이저가 이미 시리얼라이즈 처리 중인 오브젝트에 대한 참조를 발견할 때마다 해당 멤버를 건너뛰기만 하면 됩니다.(이로 인해 시리얼라이저가 무한 루프 상태가 되는 것을 방지합니다).JSON의 상위에 있는 안젤라의 부하 리스트에서 밥과 찰스 모두 상사를 나타내지 않는 것을 알 수 있습니다.JSON의 하부에 Bob과 Charles는 모두 Angela를 상사로 표시하지만, 그 시점에서 Bob과 Charles가 모두 포함되어 있지 않다는 것을 알 수 있습니다.
이 JSON을 사용하여 작업할 수도 있고, 작업을 통해 원래 개체 계층을 재구성할 수도 있지만 최적의 방법은 아닙니다.JSON을 할 수 .PreserveReferencesHandling
신신: :
JsonSerializerSettings settings = new JsonSerializerSettings
{
PreserveReferencesHandling = PreserveReferencesHandling.Objects,
Formatting = Formatting.Indented
};
string json = JsonConvert.SerializeObject(employees, settings);
이제 다음 JSON이 생성됩니다.
[
{
"$id": "1",
"Name": "Angela Anderson",
"Supervisor": null,
"Subordinates": [
{
"$id": "2",
"Name": "Bob Brown",
"Supervisor": {
"$ref": "1"
},
"Subordinates": null
},
{
"$id": "3",
"Name": "Charles Cooper",
"Supervisor": {
"$ref": "1"
},
"Subordinates": null
}
]
},
{
"$ref": "2"
},
{
"$ref": "3"
}
]
.$id
값을 지정합니다.가 처음 한 참조로 됩니다.$ref
하는 「」)$id
추가 원래 수 .이것은 JSON이 JSON을 하고 있는 로 하고 있습니다$id
★★★★★★★★★★★★★★★★★」$ref
Json j j j j j j j j j j j j 。웹 / api API
럼럼 왜왜 ?나 택? ?? ???물론 당신의 필요에 따라 다르죠. 클라이언트에 $id
/$ref
불완전한 에 두는 할 수 불완전한 데이터를 사용하는 할 수 .ReferenceLoopHandling.Ignore
JSON의 JSON을 사용하다 API 또는 다른 라이브러리를 사용하여 API Web API(「Web API」)를 할 수 .PreserveReferencesHandling.Objects
데이터가 중복된 참조가 없는 유향 비순환 그래프인 경우 어느 설정도 필요하지 않습니다.
설명이 완벽합니다.저는 아래의 것이 효과가 있었습니다.이치노
위의 , 이을 시도해 볼 수 :하다, 하다, 하다, 하다, 하다.
string json = JsonConvert.SerializeObject(data, Formatting.Indented,new JsonSerializerSettings
{
ReferenceLoopHandling = ReferenceLoopHandling.Ignore
});
언급URL : https://stackoverflow.com/questions/23453977/what-is-the-difference-between-preservereferenceshandling-and-referenceloophandl
'it-source' 카테고리의 다른 글
Angularjs가 객체를 지시로 전달 (0) | 2023.02.25 |
---|---|
SQL Plus에서 실행되는 SQL 스크립트에서 앰퍼샌드를 무시하려면 어떻게 해야 합니까? (0) | 2023.02.25 |
JQuery: '잡히지 않은 유형 오류:ajax 요청 시 잘못된 호출' - 여러 요소 (0) | 2023.02.25 |
React useState with functional update 폼이 필요한 이유는 무엇입니까? (0) | 2023.02.25 |
Django Rest-Framework 중첩된 시리얼라이저 순서 (0) | 2023.02.25 |