Newtonsoft는 속성을 무시합니까?
이 질문에 이미 답변이 있습니다.
현재 ASP MVC 컨트롤러를 통해 JSON을 반환 할 LoveSeat를 통해 CouchDB에서 데이터를 가져 오기 위해 동일한 C # DTO를 사용하고 있습니다.
컨트롤러를 통해 DTO를 전송하기 전에 NewtonSoft 라이브러리를 사용하여 내 DTO를 seralise합니다.
그러나 CouchDB는 NewtonSoft도 사용하므로 다음과 같은 속성 수준 NewtonSoft 속성도 존중합니다.
[JsonIgnore]
[JsonProperty("foo")]
어쨌든 newtonsoft 라이브러리에 이러한 속성을 명시 적으로 무시하도록 지시 할 수 있습니까? LoveSeat를 사용하면 netwonsofts JsonSerializerSettings를 완벽하게 제어 할 수있는 IObjectSerializer 구현을 제공 할 수 있습니다. 따라서 이러한 설정을 사용하여 속성을 무시할 수 있습니까?
이 시점에서 볼 수있는 유일한 대안은 DTO를 속이는 것입니다. 끔찍한 것은 아니지만 훌륭하지도 않습니다.
내가 볼 수있는 유일한 다른 방법은 다른 어셈블리 이름 등을 사용하여 내 프로젝트에 Newtonsoft.Json 소스의 내 버전을 가져 오는 것입니다. 도로.
이것이 당신이 추구하는 것인지 확실하지 않지만 당신이 [JsonIgnore]
속성을 찾고 있다는 것을 이해 합니다. 속성이 나머지 개체와 함께 JSON으로 직렬화되는 것을 중지합니다.
[JsonIgnore]
public string Whatever{ get; set; }
마음에 들지 않는 한 가지 제안. 모범 사례를 위해 거의 동일한 두 개의 개체를 사용하는 것이 좋습니다. DB에 매핑되는 데이터 액세스 레이어 (도메인 개체) 전용입니다. 앱이 관심을 가지는 별도의 DTO. 이렇게하면 도메인 개체에 대부분 DTO보다 더 많은 속성이 포함되어 문제를 분리 할 수 있습니다.
Json.NET 문서 에 따르면
클래스에 메서드를 추가 public bool ShouldSerialize_________(){...}
하고 직렬화하지 않으려는 속성의 이름으로 공백을 채울 수 있습니다 . 메서드가을 반환 false
하면 속성이 무시됩니다.
문서의 예에서는 관리자가 동일한 직원 인 경우 직원의 관리자를 직렬화하지 않습니다.
public class Employee
{
public string Name { get; set; }
public Employee Manager { get; set; }
public bool ShouldSerializeManager()
{
// don't serialize the Manager property if an employee is their own manager
return (Manager != this);
}
}
수업에 금지 설정을 할 수 있습니다.
public class DTO
{
[JsonIgnore]
public bool IsWritingToDatabase { get; set; }
public string AlwaysSerialize { get; set; }
public string Optional { get; set; }
public bool ShouldSerializeOptional()
{
return IsWritingToDatabase;
}
}
But, this isn't much simpler than having two objects. So I would recommend doing as @zbugs says, and having separate definitions for API-side and DB-side.
I ended up making all properties I needed to only add attributes to virtual, and overriding them alone in another class, with the relevant newtonsoft attributes.
This allows me to have different serialisation behavior when de-serialising from CouchDB and serialising for a GET, without too much dupe. It is fine, and a bonus, that the two are coupled; any changes in the base i would want anyway.
It would still be nice to know if my original question is possible?
This newtonking.com link helped in a similar situation. It extends the DefaultContractResolver
class. To make it work I had to replace
protected override IList<JsonProperty> CreateProperties(JsonObjectContract contract)
with
protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
참고URL : https://stackoverflow.com/questions/6309725/newtonsoft-ignore-attributes
'program tip' 카테고리의 다른 글
참조 DLL 파일이 배포 프로젝트로 bin에 복사되지 않아 오류가 발생합니다. (0) | 2020.12.08 |
---|---|
Windows에서 Postgresql 구성 파일 'postgresql.conf'는 어디에 있습니까? (0) | 2020.12.08 |
터보 링크와 함께 angularjs 사용 (0) | 2020.12.07 |
교리 2에서 소수 필드 유형을 지정할 때 스케일과 정밀도는 무엇을 의미합니까? (0) | 2020.12.07 |
Laravel의 테이블에서 모든 행 (소프트 삭제)을 가져 오는 방법은 무엇입니까? (0) | 2020.12.07 |