2017-08-11 462 views
2

我有,我不能改变一个类:无论如何,让JsonConvert.SerializeObject忽略属性上的JsonConverter属性?

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

某处线JsonConvert.SerializeObject序列化对象,因为JsonConverter属性,它吐出来了foo.EnumTypes,而不是数量的枚举值的名称。

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

+0

我认为这取决于你如何使用Foo类,如果你真的只是富序列化的一个实例本身,那么你可以实现一个不使用EnumTypes字段上的StringEnumConverter的类的版本,并在序列化之前复制字段值。你能提供更多的信息来给这个问题提供更多的背景吗? – Kodaloid

回答

3

这是可能的,但这个过程是一个有点涉及。

基本的想法是创建一个自定义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; 
    } 
} 

您还需要实际实例化这个类,并把它传递到您的串行器/解串器。看起来像什么取决于你如何做序列化,所以我不能保证一个相关的例子如何使用它。

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

JsonConvert.SerializeObject(valueToSerialize, new SerializerSettings { ContractResolver = new MyContractResolver() }); 
+0

这看起来很有前途。我如何将它传递给序列化程序?你有一个例子吗? – AngryHacker

+0

@AngryHacker就像我说的,这取决于你是如何做序列化。有很多不同的方式来做到这一点。我为“ContractResolver”链接的文档有一个例子,你可以这样做,但这不是唯一的方法。我会用一个例子来编辑答案,但我不能保证它会为你工作。 – Kyle

+0

我在发表评论5秒后就想出了它。它实际上正在做我所需要的事情。完善。 – AngryHacker

1

我不相信你可以,因为它是定义的一部分。你必须要移除的属性,并添加转换器,串行设置,而不是:

var serializerSettings = new JsonSerializerSettings 
{ 
    NullValueHandling = NullValueHandling.Ignore, 
    DefaultValueHandling = DefaultValueHandling.IgnoreAndPopulate, 

    Converters = new List<JsonConverter> { new StringEnumConverter() }, 

    ContractResolver = new Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver() 
}; 

在你可以忽略它,如果你不想使用它的话。 有一件事我忘了提,转换器必须检查类型CanConvert

public class StringEnumConverter: JsonConverter 
{ 
    public override bool CanConvert(Type objectType) 
    { 
     return typeof(MyEnum); 
    } 
} 

我没有测试的代码,但你会得到的想法。