2017-08-11 466 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); 
    } 
} 

我沒有測試的代碼,但你會得到的想法。