我有一个枚举:
public enum IdleDelayBreakMode
{
Repeat,
ShowNext
}
我正在使用NewtonSoft.Json
转换为包含该枚举类型属性的json对象。将枚举值序列化为任意整数的最佳解决方案是什么?理想情况下,我想在下面的片段中做一些事情,我想知道是否有内置的解决方案:
public enum IdleDelayBreakMode
{
[JsonValue(100)]
Repeat, // When serializing will be converted to 100
[JsonValue(200)]
ShowNext // When serializing will be converted to 200
}
答案 0 :(得分:4)
您可以像这样设置枚举值:
public enum IdleDelayBreakMode
{
Repeat = 100,
ShowNext = 200
}
Newtonsoft.Json将使用枚举值。无需设置属性。这样,无论您是需要将其序列化为JSON,还是使用Entity Framework等将其保存在数据库中,它在整个系统中都是一致的。
您是否将枚举用作整数常量存储?
在这种情况下,您可能希望从int继承它:
public enum IdleDelayBreakMode : int
答案 1 :(得分:3)
只需直接在枚举项中设置整数值,而不是使用属性:
public enum IdleDelayBreakMode
{
Repeat = 100,
ShowNext = 200
}
JSON.Net在序列化/反序列化IdleDelayBreakMode
类型的属性时会使用整数值
答案 2 :(得分:1)
假设您不想修改基础枚举值(如其他答案中所示),您可以使用[EnumMember(Value = "Name")]
属性修饰枚举值,并使用备用数值作为名称字符串:< / p>
[JsonConverter(typeof(StringEnumConverter))]
[DataContract]
public enum IdleDelayBreakMode
{
[EnumMember(Value = "100")]
Repeat,
[EnumMember(Value = "200")]
ShowNext
}
您还需要使用StringEnumConverter
进行序列化,方法是将[JsonConverter(typeof(StringEnumConverter))]
直接添加到枚举中,或者根据this answer全局应用它。
这也适用于[Flags]
。序列化以下两个值:
[Flags]
[DataContract]
[JsonConverter(typeof(StringEnumConverter))]
public enum IdleDelayBreakModeFlags
{
[EnumMember(Value = "100")]
Repeat = (1 << 0),
[EnumMember(Value = "200")]
ShowNext = (1 << 1),
}
生成"100, 200"
。
添加这些属性将导致DataContractSerializer
以及Json.NET使用这些备用名称字符串。如果您不希望影响数据合同序列化程序的行为,请删除[DataContract]
,但保留[EnumMember]
属性。