使用Newtonsoft.Json时,将枚举值转换为任意整数

时间:2016-07-14 18:57:42

标签: c# json json.net

我有一个枚举:

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  
}

3 个答案:

答案 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]属性。