ASP.NET 핵심 API에서 속성 필터링



json json.net (1)

ExpandoObject 를 사용하여 동적 속성을 사용하여 필요한 속성을 포함하는 동적 객체를 만들 수 있습니다. ExpandoObjectdynamic 키워드가 사용하는 것으로, 런타임에 속성 / 메소드를 동적으로 추가하거나 제거 할 수 있습니다.

[HttpGet("test")]
public IActionResult Test()
{
    dynamic person = new System.Dynamic.ExpandoObject();

    var personDictionary = (IDictionary<string, object>)person;
    personDictionary.Add("Name", "Muhammad Rehan Saeed");

    dynamic address = new System.Dynamic.ExpandoObject();
    var addressDictionary = (IDictionary<string, object>)address;
    addressDictionary.Add("PostCode", "AB1 2CD");

    personDictionary.Add("Address", address);

    return Json(person);
}

이로 인해

{"Name":"Muhammad Rehan Saeed","Address":{"PostCode":"AB1 2CD"}}

리플렉션을 사용하여 입력 유형을 반복하고 지정한 속성 만 전달할 서비스 / 변환기 또는 비슷한 것을 만들어야합니다.

API에서 다음 JSON을 제공하고 싶습니다.

{
  "id": 1
  "name": "Muhammad Rehan Saeed",
  "phone": "123456789",
  "address": {
    "address": "Main Street",
    "postCode": "AB1 2CD"
  }
}

클라이언트에게 관심이없는 속성을 필터링 할 수있는 기능을 제공하고자합니다. 다음 URL은 JSON의 하위 집합을 반환합니다.

`/api/contact/1?include=name,address.postcode

{
  "name": "Muhammad Rehan Saeed",
  "address": {
    "postCode": "AB1 2CD"
  }
}

ASP.NET Core에서이 기능을 구현하는 가장 좋은 방법은 다음과 같습니다.

  1. 이 솔루션은 전 세계적으로 또는 단일 제어기 또는 필터와 같은 동작에 적용될 수 있습니다.
  2. 솔루션에서 리플렉션을 사용하는 경우 성능상의 이유로 속성을 수동으로 필터링하는 코드를 제공하여 특정 컨트롤러 작업을 최적화하는 방법이 있어야합니다.
  3. JSON을 지원해야하지만 XML과 같은 다른 직렬화 형식을 지원하는 것이 좋습니다.

사용자 지정 JSON.Net ContractResolver 를 사용하는 솔루션을 발견 했습니다 . 계약 리졸버는 ASP.Net Core에서 사용하는 기본 계약 리졸버에 추가하거나이 코드 샘플과 같은 단일 작업으로 수동으로 컨트롤러에 추가하여 전 세계에 적용 할 수 있습니다. 또한 JSON 고유의 구현입니다.





asp.net-core-1.0