我有一个枚举:
public enum IdleDelayBreakMode
{
Repeat,
ShowNext
}
Run Code Online (Sandbox Code Playgroud)
我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
}
Run Code Online (Sandbox Code Playgroud)
您可以像这样设置枚举值:
public enum IdleDelayBreakMode
{
Repeat = 100,
ShowNext = 200
}
Run Code Online (Sandbox Code Playgroud)
Newtonsoft.Json将使用枚举值。无需设置属性。这样,无论您是否需要将其序列化为JSON,使用Entity Framework等将其保存在数据库中,它在整个系统中都是一致的。
您是否将枚举用作整数常量存储?
在这种情况下,您可能想要从int继承它:
public enum IdleDelayBreakMode : int
Run Code Online (Sandbox Code Playgroud)
假设您不想修改底层枚举值(如其他答案中所示),您可以用[EnumMember(Value = "Name")]属性装饰枚举值并使用备用数值作为名称字符串:
[JsonConverter(typeof(StringEnumConverter))]
[DataContract]
public enum IdleDelayBreakMode
{
[EnumMember(Value = "100")]
Repeat,
[EnumMember(Value = "200")]
ShowNext
}
Run Code Online (Sandbox Code Playgroud)
您还需要使用序列化StringEnumConverter,可以直接添加[JsonConverter(typeof(StringEnumConverter))]到枚举中,也可以根据此答案全局应用它。
[Flags]这也适用于。序列化以下两个值:
[Flags]
[DataContract]
[JsonConverter(typeof(StringEnumConverter))]
public enum IdleDelayBreakModeFlags
{
[EnumMember(Value = "100")]
Repeat = (1 << 0),
[EnumMember(Value = "200")]
ShowNext = (1 << 1),
}
Run Code Online (Sandbox Code Playgroud)
产生"100, 200".
添加这些属性将导致DataContractSerializerJson.NET 使用这些备用名称字符串。如果您不想影响数据协定序列化器的行为,请删除[DataContract]但保留[EnumMember]属性。
只需直接在枚举项中设置整数值,而不是使用属性:
public enum IdleDelayBreakMode
{
Repeat = 100,
ShowNext = 200
}
Run Code Online (Sandbox Code Playgroud)
JSON.Net 在序列化/反序列化类型的属性时将使用整数值IdleDelayBreakMode