将枚举序列化为const JsonNet

时间:2012-10-25 15:17:02

标签: javascript asp.net-mvc-3 serialization enums json.net

我使用的是Asp MVC 3应用程序。

我有一个Enum:

public enum EmployeesOptions
    {
        John = 1,
        Peter = 2,
        Andrew = 3
    }

MyViewModel班级

   public class MyViewModel
    {
        public MyViewModel()
        {
            Employees = new List<EmployeesOptions>()
            {
                EmployeesOptions.John,
                EmployeesOptions.Peter,
                EmployeesOptions.Andrew
            };
        }

        public IEnumerable<EmployeesOptions> Employees { get; set; }
    }

我的控制器:

public ActionResult Index()
        {
            var vm = new MyViewModel();
            return View(vm);
        }

在我的索引视图中:

@model MyViewModel

    <script type="text/javascript">
        var jsonString = '@Html.Raw(Newtonsoft.Json.JsonConvert.SerializeObject(this.Model))';

        var data = ko.mapping.fromJSON(jsonString);
        omega.franchiseInfo = ko.mapping.fromJS(data);
     </script>

来自服务器的序列化数据如下所示:

    Emplyees:[1,2,3]

我希望是这样的:

Emplyees:["John","Peter","Andrew"]

我错过了什么?

更新

var jsonString = '@Html.Raw(Newtonsoft.Json.JsonConvert.SerializeObject(this.Model, Newtonsoft.Json.Formatting.None, new Newtonsoft.Json.Converters.StringEnumConverter()))';

这样做了!

3 个答案:

答案 0 :(得分:3)

如果您希望此枚举类型始终使用其字符串值进行序列化,则可以使用JsonConverter属性和StringEnumConverter类对其进行装饰:

using Newtonsoft.Json;
using Newtonsoft.Json.Converters;

[JsonConverter(typeof(StringEnumConverter))]
public enum EmployeesOptions
{
    John = 1,
    Peter = 2,
    Andrew = 3
}

然后您不再需要在序列化程序选项中指定任何转换器类。

答案 1 :(得分:1)

我尝试使用List装饰Enum属性[JsonConverter(typeof(StringEnumConverter))],但可以理解的是,它不起作用,因为它应该直接装饰Enum类型。

// Did not work!
[JsonConverter(typeof(StringEnumConverter))]
public List<Assessment.AssessmentFunction> SelectedFunctions { get; set; }

然后我按照你的建议做了,它按预期工作。

var selectedFunctions = @Html.Raw(JsonConvert.SerializeObject(Model.SelectedFunctions,
                                                              new StringEnumConverter()))

现在我在Enum .cshtml视图中的JavaScript代码中获得了Enum个字符串,而不是Razor int值。正是我在特定情况下所需要的。

<强>之前

var selectedFunctions = @Html.Raw(Json.Encode(Model.SelectedFunctions))

// Output
var selectedFunctions = [3, 3, 2, 2, 2, 3, 2, 2]

<强>后

var selectedFunctions = @Html.Raw(JsonConvert.SerializeObject(Model.SelectedFunctions,
                                                              new StringEnumConverter()))

// Output
var selectedFunctions = ["Nurse","Nurse","Doctor","Doctor","Doctor","Nurse","Doctor","Doctor"]

答案 2 :(得分:0)

您正在返回枚举,默认情况下会显示枚举值。您可以像这样修改模型。

public class MyViewModel
{
    public MyViewModel()
    {
        Employees = new List<EmployeesOptions>()
        {
            EmployeesOptions.John.ToString(),
            EmployeesOptions.Peter.ToString(),
            EmployeesOptions.Andrew.ToString()
        };
    }

    public IEnumerable<EmployeesOptions> Employees { get; set; }
}

通过使用.ToString()扩展方法,我们可以将枚举转换为它们表示为字符串格式的确切内容。