web-dev-qa-db-ja.com

Newtonsoftは属性を無視しますか?

現在、同じC#DTOを使用してLoveSeat経由でCouchDBからデータをプルし、ASP MVCコントローラー経由でJSONを返します。

NewtonSoftライブラリを使用して、DTOをコントローラーに送信する前にシリアル化します。

ただし、CouchDBはNewtonSoftも使用するため、次のようなプロパティレベルのNewtonSoft属性も尊重します。

[JsonIgnore]
[JsonProperty("foo")]

とにかく、これらの属性を明示的に無視するようにnewtonsoftライブラリに伝える方法はありますか? LoveSeatを使用すると、IObjectSerializerの独自の実装を提供できます。これにより、netwonsofts JsonSerializerSettingsを完全に制御できます。これらの設定を使用して属性を無視できますか?

私がこの時点で見ることができる唯一の選択肢として、私のDTOをだますことです。それはひどいことではありませんが、素晴らしいことでもありません。

私が見ることができる唯一の他の方法は、Newtonsoft.Jsonソースの独自のバージョンを、異なるアセンブリ名などを使用してプロジェクトに取り込むことです。しかし、この方法は間違いなく嘘です。道路。

57
Jammin

最終的には、属性を仮想に追加するだけで必要なすべてのプロパティを作成し、関連するnewtonsoft属性で別のクラスでそれらを単独でオーバーライドしました。

これにより、CouchDBからデシリアライズする場合と、GETのためにシリアライズする場合に、多くの重複なしに、異なるシリアル化動作を行うことができます。 2つが結合されていることは問題ありませんが、ボーナスです。とにかく欲しいベースの変更。

私の元の質問が可能かどうかを知ることはまだいいでしょうか?

5
Jammin

これがあなたが望んでいるものかどうかはわかりませんが、私が理解していることから、あなたは[JsonIgnore]属性。プロパティが残りのオブジェクトとともにJSONにシリアル化されるのを停止します。

[JsonIgnore]
public string Whatever{ get; set; }
83
Jimbo

気に入らないという提案もあります。ベストプラクティスとして、2つのほぼ同一のオブジェクトを用意することをお勧めします。 DBにマップするデータアクセスレイヤー(ドメインオブジェクト)専用です。そして、アプリが気にする個別のDTO。このように、ドメインオブジェクトには主にDTOよりも多くのプロパティが含まれ、懸念事項を分離できます。

10
zbugs

条件付きプロパティを使用して、シリアル化からプロパティを除外します。

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);
    }
}

https://www.newtonsoft.com/json/help/html/SerializeConditionalProperty.htm

7
alhpe

このnewtonking.comリンク は同様の状況で役に立ちました。 DefaultContractResolverクラスを拡張します。動作させるには、交換する必要がありました

protected override IList<JsonProperty> CreateProperties(JsonObjectContract contract)

protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
3
joym8