无论如何要让JsonConvert.SerializeObject忽略属性上的JsonConverter属性?

Ang*_*ker 3 c# serialization json.net

我有一堂课,我无法改变:

public enum MyEnum {
    Item1 = 0,
    Item2 = 1
}
public class foo {
    [JsonConverter(typeof(StringEnumConverter))]
    public MyEnum EnumTypes {get; set; }
}
Run Code Online (Sandbox Code Playgroud)

该行的某个地方JsonConvert.SerializeObject序列化了该对象,并且由于该JsonConverter属性,它会为该值foo.EnumTypes而不是数字吐出枚举值的名称.

无论如何都要JsonConvert.SerializeObject忽略属性上的EnumTypes属性?

Kyl*_*yle 6

这是可能的,但这个过程很少涉及.

基本思想是创建自定义ContractResolver并覆盖其CreateProperty方法.像这样的东西:

internal sealed class MyContractResolver : DefaultContractResolver
{
    protected override JsonProperty CreateProperty( MemberInfo member, MemberSerialization memberSerialization )
    {
        var property = base.CreateProperty( member, memberSerialization );

        if( member.DeclaringType == typeof( foo ) && property.PropertyType == typeof( MyEnum ) )
        {
            property.Converter = null;
        }

        return property;
    }
}
Run Code Online (Sandbox Code Playgroud)

您还需要实际实例化此类并将其传递给序列化器/反序列化器.看起来的样子取决于你是如何进行序列化的,所以我无法保证如何使用它的相关示例.

如果您只是使用静态SerializeObject方法:

JsonConvert.SerializeObject( valueToSerialize, new SerializerSettings { ContractResolver = new MyContractResolver() } );
Run Code Online (Sandbox Code Playgroud)