强制框架使用枚举实体名称而不是其值

时间:2013-01-24 15:43:15

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

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

这是我的枚举:

    public enum ReturnCode { OK, InvalidParameter }

这就是我得到的:

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

但这就是我想要的:

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

有没有办法实现这个目标?

3 个答案:

答案 0 :(得分:4)

您可以使用JsonConverter。

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

要么对你的财产进行anotate:

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

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

答案 1 :(得分:0)

如果不更好地了解您的使用模式,很难提出建议......但不能少。

将枚举设为私有字段。

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

答案 2 :(得分:0)

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

示例:

[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;
        }
    }
}

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

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

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