【问题标题】:Converting enum values to arbitrary integers when using Newtonsoft.Json使用 Newtonsoft.Json 时将枚举值转换为任意整数
【发布时间】:2016-07-14 18:57:41
【问题描述】:

我有一个枚举:

public enum IdleDelayBreakMode
{
    Repeat,
    ShowNext
}

我正在使用 NewtonSoft.Json 转换为包含该枚举类型属性的 json 对象。将该枚举的值序列化为任意整数的最佳解决方案是什么?理想情况下,我想在下面的 sn-p 上做类似的事情,我想知道是否有内置的解决方案:

public enum IdleDelayBreakMode
{
    [JsonValue(100)]
    Repeat,             // When serializing will be converted to 100

    [JsonValue(200)]
    ShowNext            // When serializing will be converted to 200  
}

【问题讨论】:

  • 如果你只是设置它们的值呢? Repeat = 100ShowNext = 200.
  • 您想将枚举序列化为不同于枚举定义方式的整数吗?
  • 你需要创建一个继承自JsonConverter的类,然后将此属性应用到你的枚举[JsonConverter(typeof(MyConverter))]

标签: c# json json.net


【解决方案1】:

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

public enum IdleDelayBreakMode
{
    Repeat = 100,
    ShowNext = 200
}

Newtonsoft.Json 将使用枚举值。无需设置属性。这样,无论您是否需要将其序列化为 JSON、使用 Entity Framework 将其保存在数据库中等,它都会在整个系统中保持一致。


您是否将枚举用作整数常量存储?

在这种情况下,您可能希望从 int 继承它:

public enum IdleDelayBreakMode : int

【讨论】:

    【解决方案2】:

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

    public enum IdleDelayBreakMode
    {
        Repeat = 100,
        ShowNext = 200
    }
    

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

    【讨论】:

      【解决方案3】:

      假设您不想修改底层枚举值(如其他答案所示),您可以使用 [EnumMember(Value = "Name")] 属性装饰您的枚举值,并使用替代数值作为名称字符串:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-24
        • 1970-01-01
        • 1970-01-01
        • 2011-07-14
        相关资源
        最近更新 更多