program tip

Newtonsoft는 속성을 무시합니까?

radiobox 2020. 12. 8. 07:54
반응형

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

반응형