7

ASP.NET Web API アプリケーションで特定の型に対してのみコントラクト シリアライザーを設定したいと考えています。次のように、App_Start/FormatterConfig.cs で設定をグローバルに設定できます。

public static void RegisterGlobalFormatters(MediaTypeFormatterCollection formatters)
{
    jsonSerializerSettings.ContractResolver = new CriteriaContractResolver(new List<string>(new string[]{"mdData", "name", "label"})); 

...

しかし、これを1つ以上の特定のクラスタイプに適用するにはどうすればよいですか?

これを行う理由は、次の例のように、Web サービスの構成またはパラメーターに基づいて、実行時にどのフィールドをシリアル化する必要があるかを設定できる必要があるためです。

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

http://json.codeplex.com/discussions/347610

4

3 に答える 3

4

いくつかのオプションがあります:

  • カスタム フォーマッタによって処理されるカスタム タイプを作成します。このカスタム型は、(何らかの方法で) シリアル化する必要があるフィールドを指定できます (そして、その情報は Json シリアライザーに供給されます)。
  • コントローラーごとの構成 (ここを参照) を参照して、必要に応じてフォーマッターをセットアップしてみてください
于 2012-09-20T08:45:15.497 に答える
1

「プロパティ」リストで指定されたパラメーターのみを書き込む JsonConverter を使用することになりました。ContractResolver やフォーマッターよりも低レベルですが、特定のタイプに対していずれかを構成することはできないと思います。

public class ResourceConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return (objectType == typeof(Resource));
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        List<string> properties = new List<string>(new string[] { "Name", "Label" });

        writer.WriteStartObject();
        foreach (MemberInfo mi in value.GetType().GetMembers(BindingFlags.GetField | BindingFlags.Instance | BindingFlags.Public) )
        {
            PropertyInfo p = mi as PropertyInfo;

            if (p != null && p.GetCustomAttributes(typeof(JsonIgnoreAttribute), true).Length == 0 && properties.Contains(p.Name))
            {
                writer.WritePropertyName(p.Name);
                serializer.Serialize(writer, p.GetValue(value, new object[] { }));
            }
        }
        writer.WriteEndObject();
    }
}

これは、属性を使用してクラスに適用できます。

[JsonConverter(typeof(ResourceConverter))]

これはハックのようですが、リフレクションを直接使用するのではなく、コントラクト リゾルバーを使用してシリアル化するプロパティのリストを取得する必要があると思いますが、方法がわかりません。

于 2012-09-24T21:04:45.343 に答える
0

私はこのようなものを作成しようとします

public class MyJsonFormatter : JsonMediaTypeFormatter
    {
        public override bool CanWriteType(Type type)
        {
            return type == typeof(MyClass);
        }
    }

これをフォーマッタ コレクションの先頭に挿入します。

于 2012-09-20T12:46:11.160 に答える