2014-10-16 74 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