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

Mar*_*mro 2 c# json json.net

我有一个枚举:

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)

And*_*rei 7

您可以像这样设置枚举值:

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)


dbc*_*dbc 6

假设您不想修改底层枚举值(如其他答案中所示),您可以用[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]属性。


Ped*_*dro 5

只需直接在枚举项中设置整数值,而不是使用属性:

public enum IdleDelayBreakMode
{
    Repeat = 100,
    ShowNext = 200
}
Run Code Online (Sandbox Code Playgroud)

JSON.Net 在序列化/反序列化类型的属性时将使用整数值IdleDelayBreakMode