如何为特定类型而不是全局设置Json.NET ContractSerializer?

Rn2*_*222 7 c# json.net asp.net-web-api

我想在我的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"})); 
Run Code Online (Sandbox Code Playgroud)

...

但是我怎样才能将它应用于一个或多个特定的类类型?

我想这样做的原因是因为我需要能够根据Web服务的配置或参数设置在运行时应该序列化哪些字段,类似于这些示例:

使用JSON.net,在基类上下文中使用时,如何防止派生类的序列化属性?

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

Rn2*_*222 2

我最终使用了一个 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

这可以应用到使用属性的类:

[JsonConverter(typeof(ResourceConverter))]
Run Code Online (Sandbox Code Playgroud)

不过,这看起来像是一种黑客攻击,我认为我应该使用合同解析器来获取要序列化的属性列表,而不是直接使用反射,但我不确定如何操作。