JSON.net を使用して、基本クラスのコンテキストで使用されるときに派生クラスのプロパティのシリアル化を防ぐにはどうすればよいですか? 質問する

JSON.net を使用して、基本クラスのコンテキストで使用されるときに派生クラスのプロパティのシリアル化を防ぐにはどうすればよいですか? 質問する

データ モデルが与えられた場合:

[DataContract]
public class Parent
{
    [DataMember]
    public IEnumerable<ChildId> Children { get; set; }
}

[DataContract]
public class ChildId
{
    [DataMember]
    public string Id { get; set; }
}

[DataContract]
public class ChildDetail : ChildId
{
    [DataMember]
    public string Name { get; set; }
}

ChildId実装の利便性のため、のオブジェクトがParent実際には オブジェクトである場合がありますChildDetail。JSON.net を使用して をシリアル化するとParent、すべてのプロパティとともに書き出されますChildDetail

基本クラスとしてシリアル化するときに派生クラスのプロパティを無視するように JSON.net (または他の JSON シリアライザー。私はプロジェクトにまだ十分に取り組んでいないので、どれか 1 つにコミットしていません) に指示する方法はありますか?

編集: 派生クラスを直接シリアル化するときに、すべてのプロパティを生成できることが重要です。オブジェクト内のポリモーフィズムを抑制したいだけですParent

ベストアンサー1

私はカスタム契約リゾルバーどのプロパティをシリアル化するかを制限します。これで正しい方向がわかるかもしれません。

例えば

/// <summary>
/// json.net serializes ALL properties of a class by default
/// this class will tell json.net to only serialize properties if they MATCH 
/// the list of valid columns passed through the querystring to criteria object
/// </summary>
public class CriteriaContractResolver<T> : DefaultContractResolver
{
    List<string> _properties;

    public CriteriaContractResolver(List<string> properties)
    {
        _properties = properties
    }

    protected override IList<JsonProperty> CreateProperties(
        JsonObjectContract contract)
    {
        IList<JsonProperty> filtered = new List<JsonProperty>();

        foreach (JsonProperty p in base.CreateProperties(contract))
            if(_properties.Contains(p.PropertyName)) 
                filtered.Add(p);

        return filtered;
    }
}

オーバーライド IList 関数では、リフレクションを使用して、親プロパティのみをリストに設定できる可能性があります。

コントラクト リゾルバーは json.net シリアライザーに適用されます。この例は asp.net mvc アプリからのものです。

JsonNetResult result = new JsonNetResult();
result.Formatting = Formatting.Indented;
result.SerializerSettings.ContractResolver = 
    new CriteriaContractResolver<T>(Criteria);

おすすめ記事