如何将枚举数组序列化为字符串的Json数组?

6
基于Diego在此问题中未得到回答的评论:将C#枚举类型序列化为字符串的JSON序列化,考虑一个枚举类型:
public enum ContactType
{
    Phone = 0,
    Email = 1,
    Mobile = 2
}

例如,一个属性:

//could contain ContactType.Phone, ContactType.Email, ContactType.Mobile
IEnumerable<ContactType> AvailableContactTypes {get;set;} 

转换成类似JSON的格式:
{ContactTypes : ['Phone','Email','Mobile']}

替代

{ContactTypes : [0,1,2]}

与常规的JavaScriptSerializer一样吗?

使用字符串来表示值吗? - Shmiddty
一些序列化库具有一个布尔值,您可以翻转它以确定序列化枚举的输出。我曾看到MVC开发人员之一演示了此功能的视频..不幸的是,我找不到这个视频。 - afreeland
2个回答

3
在Json.NET的较新版本中,通过JsonProperty属性的ItemConverterType属性进行适当的设置,可以解决此问题。具体文档请参见:http://james.newtonking.com/archive/2012/05/08/json-net-4-5-release-5-jsonproperty-enhancements.aspx。但我因为与自己的项目相关问题无法尝试它。最终,我按照Shmiddty的建议将我的视图模型转换为IEnumerable<string>(仍存在阻抗不匹配问题,将在未来进行重构)。希望这能帮助有同样问题的人!以下是使用示例:
[JsonProperty(ItemConverterType = typeof(StringEnumConverter))]
IEnumerable<ContactType> AvailableContactTypes {get;set;} 

2

在这种情况下,我始终发现添加额外的属性比尝试更改json.net解析器的行为更容易。

[JsonIgnore]
IEnumerable<ContactType> AvailableContactTypes {get;set;}

IEnumerable<string> AvailableContactTypesString
{
    get { return AvailableContactTypes.Select(c => c.ToString()); }
}

当然,如果你需要反序列化,那么你也需要在该属性上设置一个 setter。
set { AvailableContactTypes = value
    .Select(c => Enum.Parse(typeof(ContactType), c) as ContactType); }

是的,目前正在这样做,但不是作为属性,只是在构造函数中...有点冗长... - Mark Gibaud
无法使其工作。 - Amit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接