【问题标题】:Can I configure ServiceStack.Text to serialize enum values to camelCase?我可以配置 ServiceStack.Text 以将枚举值序列化为 camelCase 吗?
【发布时间】:2012-03-05 21:16:36
【问题描述】:

我正在查看 JSON.NET 和 ServiceStack.Text 以将 POCO 对象序列化为 JSON。 JSON.NET 看起来非常灵活,但有一点性能成本。 ServiceStack.Text 似乎以更好的性能提供了我需要的几乎所有东西。 ServiceStack 似乎只缺少一件事......

如果我有一个包含枚举属性的对象,请说如下枚举...

public enum PersonStatus
    {
        ActiveAgent,
        InactiveAgent
    }

public class Person
    {
        //A bunch of other properties
        public PersonStatus Status { get; set; }
    }

如果我使用以下代码将 ServiceStack 配置设置为使用 camelCase 进行序列化:

ServiceStack.Text.JsConfig.EmitCamelCaseNames = true;

我最终将 Status 属性序列化如下:

状态:ActiveAgent

注意属性名是驼峰式,但枚举值是PascalCase。

无论我使用 ServiceStack.Text 的 JsonSerializer 还是 TypeSerializer,这种行为似乎都是一致的。

ServiceStack 中是否有一种简单的方法可以改变这种行为,使值也是驼峰式?

【问题讨论】:

    标签: c# json.net servicestack


    【解决方案1】:

    不,该值在 JSON 和 JSV 序列化程序中都是字符串文字,并且在序列化程序中没有选项可以更改实际值以使用 camelCase 或任何其他修饰符。

    做到这一点的唯一方法是不将枚举重命名为具有 camelCase 值,即为枚举指定自定义序列化函数。默认情况下,ServiceStack.Text 不会为自定义序列化 fn 发出默认值,因此您要么想要添加 PersonStatus.None 值(不会发出),要么设置 JsConfig.IncludeNullValues = true 以使 ServiceStack.Text 发出默认值。

    所有这些看起来像:

    JsConfig.EmitCamelCaseNames = true;
    JsConfig.IncludeNullValues = true;
    JsConfig<PersonStatus>.SerializeFn = text => text.ToString().ToCamelCase();
    

    【讨论】:

    • 感谢您的快速回复!由于我无法控制的其他原因,最终不得不使用 JSON.NET,但我喜欢 ServiceStack.Text 的易用性和性能。
    • @mythz 你知道是否有办法实例化 JsonSerializer 并仅将配置应用于那个实例?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-18
    相关资源
    最近更新 更多