阻止ServiceStack序列化ENUM

时间:2014-04-22 13:47:17

标签: c# json enums servicestack

这是我目前的回复......(来自我的RESTful API)

[
  {
    "batchID": 1,
    "status": "IN_PROGRESS"
  }
]

但我真正想要的是......

[
  {
    "batchID": 1,
    "status": 10   -- which means "In_progress" in my ENUM
  }
]

这是我的c#DTO ......

public class ReplyItem
{
    public int BatchID { get; set; }            
    public BatchStatusCodes Status { get; set; }
}

所以在JSON中我的BatchStatusCode被序列化为一个字符串,但我希望它是一个整数,因为ENUM具有特定的每个值集(在5的上升)

一个解决方案:我知道我可以将BatchStatusCodes更改为int,每当我使用它时,我可以将ENUM转换为整数,但包括ENUM在回复中使它稍微更自我描述。

我希望也许我可以使用一个属性或一些这样的奇特技巧,或者设置一个服务范围的变量来不处理当前的枚举?

3 个答案:

答案 0 :(得分:7)

您可以将[Flags]属性添加到您希望被视为数字的枚举中,例如:

[Flags]
BatchStatusCodes { ... } 

否则,您可以使用ServiceStack.Text将所有枚举视为整数:

JsConfig.TreatEnumAsInteger = true;

答案 1 :(得分:1)

<rant>虽然,我会不惜一切代价避免使用Magic Numbers。想象一下你以后需要支持这项服务,你应该如何记住所有这些数字... </rant>

无论如何,你试着告诉SS使用UseBclJsonSerializers。在AppHost配置方法中添加:

SetConfig(new HostConfig{
     // ...
     UseBclJsonSerializers = true,
     // ...
});

答案 2 :(得分:1)

老问题,我知道,但我在寻找同样的问题时出现了。 如果我们有

public eStatus Status { get; set; }

然后我们只需添加一个

public int StatusId => (int)Status;

(旧语中为public int StatusId { get { return (int)Status } }

如果您不想在序列化输出中使用原始内容,则可以将原始内容标记为不可序列化,但请记住,除非您创建等效的setter,否则它不会从该数字反序列化。 / p>