내가 수업이 있다고 상상 해보자
public class Foo
{
public int Prop1 { get; set; }
public int Prop2 { get; set; }
public int Prop3 { get; set; }
}
그리고 일부 컨트롤러 FooController에서 이러한 클래스 Foo의 List <>를 만들고 데이터로 채우고 Newtonsoft.Json으로 직렬화하고 클라이언트로 전송한다고 상상해보십시오.
괜찮아, 문제 없어.
하지만 User1은 Prop1의 데이터를 볼 수없고 User2는 Prop3의 데이터를 볼 수 없다는 사용자 별 권한 시스템도 있습니다. 그리고 나는 그러한 Foo 클래스와 시스템의 다른 사용자에 대한 많은 권한을 가지고 있습니다. 그리고 사용자가 허용되지 않는 열의 데이터를 볼 수 없도록 json 직렬화를 중단하고 JSON 직렬화에서 허용되지 않는 사용자 열을 제외하기로 결정했습니다.
현재로서는 이미 사용자 정의 JsonConverter로 작성되어 있으므로 그렇게 할 수 있습니다. 그러나 이것은 복잡하고 (입력 클래스 스캔, 동적 접근 자 컴파일, 재귀 등) 네이티브 newtonsoft와 비슷하게 느립니다.
위의 사실과 관련하여 원하는 결과를 얻는 더 쉬운 방법이 있는지 묻고 싶습니다. 사용자 지정 JsonConverter를 만들지 않고 json 클래스로 직렬화 된 모든 열을 제거합니다.
답변 해 주셔서 감사합니다!
업데이트 @SebastianStehle의 답변을 따랐습니다. 필드를 제외하는 기능을 사용하여 클래스를 사전에 매핑하도록 내 매퍼를 확장했습니다.
당신의 문제는 논리 지향적입니다. 키-값이 다르며 시나리오에 따라 클라이언트에 전송하려고합니다.
Newtonsoft.Json은 json을 직렬화합니다. 이것이 목표이며 직렬화기에 논리를 추가하지 않는 것이 좋습니다. 디버그 / 유지 관리가 더 어렵고, 하나의 객체 / 클래스가 한 가지 일을 한다는 생각을 유지하는 것이 더 어렵습니다 . 이를 단일 책임 원칙 이라고합니다 .
로직을 어떻게 / 어디에 추가합니까? 개체와 함께 명령 패턴 을 인수 로 사용하는 것이 좋습니다 . 이 "패턴"을 사용하면 매개 변수 (인수 개체의 속성)를 쉽게 추가하고 명령에 논리를 추가 할 수 있습니다. 마지막에 키-값 목록 또는 객체를 반환하고 json.net이 직렬화하도록 할 수 있습니다.
이 솔루션은 약간 복잡해 보일 수 있지만 장기적인 관점에서 확실히 유용합니다. 구현 방법에 대해 자세히 설명 할 수 있습니다.
마지막 팁 : ASP.NET WEBAPI를 사용하여 개체를 직렬화 할 수 있습니다 (훌륭한 Newtonsoft.Json의 json.net 사용).
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다