【问题标题】:Serialize a container of enums as strings using JSON.net使用 JSON.net 将枚举容器序列化为字符串
【发布时间】:2013-09-09 12:20:34
【问题描述】:

您可以通过添加属性将 WebAPI 模型中的枚举字段序列化为字符串:

enum Size
{
    Small,
    Medium,
    Large
}

class Example1
{
    [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))]
    Size Size { get; set; }
}

这将序列化为这个 JSON:

{
  "Size": "Medium"
}

如何为枚举集合完成相同的操作?

class Example2
{
    IList<Size> Sizes { get; set; }
}

我想序列化成这个 JSON:

{
  "Sizes":
  [
    "Medium",
    "Large"
  ]
}

【问题讨论】:

    标签: c# asp.net-web-api json.net


    【解决方案1】:

    你需要使用JsonPropertyAttribute.ItemConverterType属性:

    class Example2
    {
        [JsonProperty (ItemConverterType = typeof(StringEnumConverter))]
        public IList<Size> Sizes { get; set; }
    }
    

    【讨论】:

    • 那么如何实际填充Sizes
    • 非常感谢,卡了一天半
    • 我怎么能用[EnumMember(Value = "?")] EMPTY = '?' 做到这一点,这样我的模型(对于[FromBody])可以反映json 的属性是一个数组,如:[ 'X', '?', 'X' ],产生:[ MyEnum.X, MyEnum.EMPTY, MyEnum.X ]
    【解决方案2】:

    我在我的网络应用程序的启动代码中有这个,用于将所有枚举序列化为字符串(我更喜欢将枚举名称传递给值,这会使事情更健壮)。

    必须承认我从未在枚举列表上尝试过它,所以我不知道它会做什么 - 可能值得一试。

    var jsonFormatter = config.Formatters.JsonFormatter;
    jsonFormatter.SerializerSettings.Converters.Add(new StringEnumConverter { CamelCaseText = true });
    

    【讨论】:

    • 我可以确认这适用于枚举列表。我理想的解决方案是允许在每个属性的基础上选择加入,但这很有效,总比没有好。谢谢!
    • @Jon-Eric Athari 的解决方案也有效,并且会为您提供您正在寻找的每个属性的选择加入。
    • 它似乎对 Dictionary 不起作用:/
    猜你喜欢
    • 2012-05-10
    • 2017-06-16
    • 2012-02-27
    • 1970-01-01
    • 2013-12-04
    • 2011-01-08
    • 1970-01-01
    • 2014-09-22
    • 1970-01-01
    相关资源
    最近更新 更多