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

时间:2013-02-19 17:55:28

标签: javascript json.net javascriptserializer

基于迭戈在这个问题中最高投票回答的未答复评论:

JSON serialization of enum as string

所以对于一个枚举:

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一样吗?

2 个答案:

答案 0 :(得分: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); }

答案 1 :(得分:1)

似乎在Json.NET的更高版本之一中,通过ItemConverterType属性的JsonProperty属性为此提供了适当的规定,如下所示:

http://james.newtonking.com/archive/2012/05/08/json-net-4-5-release-5-jsonproperty-enhancements.aspx

我无法尝试,因为我遇到了与我自己的项目相关的从Json.NET 3.5升级的问题。最后,根据Shmiddty的建议,我将视图模型转换为IEnumerable<string>(虽然仍然存在阻抗不匹配,但我将来会重新进行重构)。

希望能帮助其他人解决同样的问题!

使用示例:

[JsonProperty(ItemConverterType = typeof(StringEnumConverter))]
IEnumerable<ContactType> AvailableContactTypes {get;set;} 
相关问题