使用 ServiceStack 自定义 Json 枚举序列化

Posted

技术标签:

【中文标题】使用 ServiceStack 自定义 Json 枚举序列化【英文标题】:Custom Json Enum Serialization using ServiceStack 【发布时间】:2014-12-12 03:34:05 【问题描述】:

我正在尝试序列化 json 中的枚举。 如果枚举值为“男性”和“女性”。我想要它作为“M”和“F”。 这是代码示例,它适用于 XmlSerializer,但我需要使其适用于 JsonSerializer

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 进行了测试,它工作正常。

【讨论】:

感谢您的回复。我尝试了同样的事情,但似乎对我不起作用。 你能用你用来序列化枚举的确切代码更新问题吗?此外,您还可以指定 ServiceStack 库的版本,因为这也可能是一个问题。 它仍然给我“Male”而不是“M”。我正在使用产品版本:3.9.59.0 我刚刚检查了那个版本,肯定有问题。但是,当我使用最新版本时,它就像一个魅力。能否更新软件包以使用最新版本的 ServiceStack.Text? 禅宗编码器。谢谢。您的代码似乎适用于 4.0 版。它是免费提供的还是我必须付费使用。

以上是关于使用 ServiceStack 自定义 Json 枚举序列化的主要内容,如果未能解决你的问题,请参考以下文章

ServiceStack JSON 类型定义应以“”开头

ServiceStack 对身份验证失败的自定义响应

解析 ServiceStack 服务并定义内容类型

ServiceStack.OrmLite:索引的自定义命名可以在代码中完成吗?

使用带有 servicestack 的构造函数反序列化 json

使用 JSON 时如何让 ServiceStack 用破折号格式化 Guid?