4

MVC4 が NewtonSoft Json デシリアライゼーションを使用していることは知っています。JsonIgnore/DataMemberIngore などのデータ注釈を使用せずに、クライアントへのシリアル化でプロパティを除外する方法を考えていました (アセンブリは他の場所で使用され、変更できません。カスタム フォーマッタ/JsonSerializerSettings/Dynamic ContractResolver を実装できますか?などを特定のオブジェクト タイプに適用してから、特定のプロパティ名を除外しますか?

どんな助けでも大歓迎です。

編集。最初の試みとして次のことを思いつきました。誰かがよりエレガントなソリューションを持っている場合は、私に知らせてください...

public class DynamicContractResolver : DefaultContractResolver
{
    public DynamicContractResolver()
    {

    }

    protected override IList<JsonProperty> CreateProperties(Type type, Newtonsoft.Json.MemberSerialization memberSerialization)
    {

        IList<JsonProperty> properties = base.CreateProperties(type, Newtonsoft.Json.MemberSerialization.Fields);

        if (type == typeof(SomeType))
        {
            var matchedProp = properties.Where(v=> v.PropertyName=="SomeProperty").FirstOrDefault();
            if (matchedProp!=null)
            {
                properties.Remove(matchedProp);
            }
        }


        return properties;
    }
}

global.asax に組み込まれています。

HttpConfiguration config = GlobalConfiguration.Configuration;
JsonSerializerSettings serializerSetting = new JsonSerializerSettings
        {
            ContractResolver = new DynamicContractResolver(),
            ReferenceLoopHandling = ReferenceLoopHandling.Serialize
        };

config.Formatters.JsonFormatter.SerializerSettings = serializerSetting;

よろしくフィル

4

1 に答える 1

0

これは適切なオーバーライドで解決可能です

  1. MVCクラスJsonにある関数をオーバーライドします。Controllerこのクラスでは、データをカスタマイズできます。(別のマッピング、反射、...)

  2. カスタム JsonResult クラスを作成し、デフォルトのものをオーバーライドするだけです。そこで行われているデフォルトのシリアル化をオーバーライドすることもできます。

    今:

    • JSON のシリアル化された文字列が既にある場合は、このデータを除外できます。これが最も簡単なオプションです。基本的に文字列操作のみです。
    • 一方、カスタムの NewtonSoft シリアライゼーションを呼び出すこともでき、そこでやりたいことが何でもできます。カスタム シリアライゼーションを使用することさえできます。
于 2013-03-09T06:55:38.450 に答える