2014-10-16 49 views
1

我想在json中序列化枚舉。 如果枚舉值是「男」和「女」。我想要它作爲「M」和「F」。 下面是代碼示例,它適用於XmlSerializer的,但我需要使它成爲JsonSerializer使用ServiceStack的自定義Json枚舉序列化

工作
public enum Gender 
{ 
    [EnumMember(Value = "M"), XMLEnum("M")] 
    Male, 

    [EnumMember(Value = "F"), XMLEnum("F")] 
    Female 
} 

附:我使用ServiceStack作爲Json串行器

回答

1

一個不錯的方法是使用ServiceStack配置對象的SerializeFn例程,併爲Gender枚舉配置自定義序列化。

var person = new Person() 
{ 
    FullName = "John Johnson", 
    Gender = Gender.Male 
}; 

JsConfig<Gender>.SerializeFn = c => 
    c.Equals(Gender.Male) ? "M" : "F"; 

var result = person.ToJson(); // {"FullName":"John Johnson","Gender":"M"} 

更新:既然我們確定你不能你ServiceStack.Text庫升級到4+,你一定想利用現有的enummember屬性,這裏是完全跳過SerializeFn辦法解決。

您可以安裝一個名爲ServiceStack.Text.EnumMemberSerializer的附加nuget包,它允許您使用現有的enummember屬性。這裏是代碼,使其工作:

new EnumSerializerConfigurator() 
    .WithEnumTypes(new Type[] { typeof(Gender) }) 
    .Configure(); 

JsConfig.Reset(); 

var result = JsonSerializer.SerializeToString(person); // {"FullName":"John Johnson","Gender":"M"} 

我已經測試ServiceStack.Text 3.9,它的工作。

+0

感謝您的回覆。我嘗試了同樣的事情,但似乎沒有爲我工作。 – Krushal 2014-10-16 18:09:50

+0

你能用你用來序列化枚舉的確切代碼更新問題嗎?此外,您還可以指定ServiceStack庫的版本,因爲這也可能是一個問題。 – 2014-10-16 18:14:01

+0

它仍然給我「男」而不是「M」。我正在使用產品版本:3.9.59.0 – Krushal 2014-10-16 18:20:48