【问题标题】:Force Framework to use Enum Entity Name instead of its Value [duplicate]强制框架使用枚举实体名称而不是其值 [重复]
【发布时间】:2013-01-08 10:27:21
【问题描述】:

我创建了一个 ASP.NET MVC 4 Web 应用程序。在这个应用程序中,我实现了几个其余的 web 服务,我的问题来了:是否可以强制对象序列化使用枚举实体名称而不是它们的值?

这是我的枚举:

    public enum ReturnCode { OK, InvalidParameter }

这是我得到的:

{
   "returnCode": 0,
   "data": null
}

但这就是我想要的:

{
   "returnCode": OK,
   "data": null
}

有没有办法做到这一点?

【问题讨论】:

标签: c# asp.net-mvc rest asp.net-web-api


【解决方案1】:

您可以使用 JsonConverter。

这个问题JSON serialization of enum as string 中提到的JSON.Net StringEnumConverter 有一个原生的

注释您的属性:

[JsonConverter(typeof(StringEnumConverter))]
public enum ReturnCode { OK, InvalidParameter }

或使用WebApi Json.NET custom date handling 中的配置示例在全局序列化器设置中注册。

【讨论】:

    【解决方案2】:

    是的,您可以这样做。您需要声明额外的字符串属性并在序列化/反序列化时使用它。

    例子:

    [DataContract]
    public class MyResource
    {
        [DataMember]
        public string Data { get; set; }
    
        public ReturnCode Code { get; set; }
    
        [DataMember(Name = "returnCode")]
        string ReturnCodeString
        {
            get { return this.Code.ToString(); }
            set
            {
                ReturnCode r;
                this.Code = Enum.TryParse(value, true, out r) ? r : ReturnCode.OK;
            }
        }
    }
    

    所以现在您可以将枚举的值作为字符串传递(从服务器和客户端的两个方向),即:

    {
       "returnCode": "OK",
       "data": null
    }
    

    {
       "returnCode": "InvalidParameter",
       "data": null
    }
    

    【讨论】:

      【解决方案3】:

      如果不更好地了解您的使用模式,就很难提出建议……但仍然如此。

      使枚举成为私有字段。

      使用返回私有枚举字段的实体名称的 getter 和使用 Enum.Parse 设置私有字段值的 setter 构建一个公共字符串属性

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-09
        • 1970-01-01
        • 2012-12-28
        • 1970-01-01
        • 2012-11-05
        • 1970-01-01
        相关资源
        最近更新 更多