3

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

这是我的枚举:

    public enum ReturnCode { OK, InvalidParameter }

这就是我得到的:

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

但这就是我想要的:

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

有没有办法做到这一点?

4

3 回答 3

4

您可以使用 JsonConverter。

StringEnumConverter在这个问题JSON serialization of enum as string中提到了 JSON.Net 的原生版本

注释您的财产:

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

或者使用WebApi Json.NET 自定义日期处理中的配置示例在全局序列化器设置中注册。

于 2013-01-24T15:58:26.907 回答
0

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

使枚举成为私有字段。

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

于 2013-01-24T15:56:27.920 回答
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;
        }
    }
}

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

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

或者

{
   "returnCode": "InvalidParameter",
   "data": null
}
于 2013-01-24T15:58:09.760 回答