【问题标题】:How to serialize enum to null value using JSON.net如何使用 JSON.net 将枚举序列化为空值
【发布时间】:2014-09-22 08:51:04
【问题描述】:

我正在使用第 3 方 REST API,其中一个字段(类型 string)具有一组已知值,我在我的代码中将其建模为 enum。 JSON.NET 中的StringEnumConverter 正确序列化了除[EnumMemberAttribute] 注释中描述的这些值之一之外的所有值。特别是对于这个字段,REST API 将null 值转换为第 3 方系统中的“系统默认值”;但是,当 JSON.NET 序列化它时,它使用成员名称而不是注释中描述的值。我知道我可以编写一个自定义转换器来处理这个问题,但我的问题是,是否有一种方法可以在没有它的情况下让它工作,因为它只是 null 值不能正确序列化?

我在代码中定义的enum

[JsonConverter(typeof(StringEnumConverter))]
public enum InitialScanLevel
{
    [EnumMember(Value = null)]
    SystemDefault,

    [EnumMember(Value = "0")]
    ModelDeviceOnly,

    [EnumMember(Value = "1")]
    InitialAppPopulation,

    [EnumMember(Value = "2")]
    DiscoverSslCerts,

    [EnumMember(Value = "3")]
    DiscoverOpenPorts,

    [EnumMember(Value = "4")]
    AdvancedPortDiscovery,

    [EnumMember(Value = "5")]
    DeepDiscovery
}

对于InitialScanLevel.SystemDefault,生成的 JSON 是(不是第 3 方 API 所期望的)

{
    other fields...,
    "initialScanLevel":"SystemDefault",
    other fields...
}

但应该是

{
    other fields...,
    "initialScanLevel":null,
    other fields...
}

对于InitialScanLevel.DeepDiscovery,生成的 JSON 是(这是第 3 方 API 所期望的)

{
    other fields...,
    "initialScanLevel":"5",
    other fields...
}

【问题讨论】:

  • @Jashaszun 感谢您的编辑。我没有意识到 ` 会正确突出显示这些内容。
  • 随时! :) 顺便说一句,您可能应该通读formatting help。那里可能有很多值得了解的信息花絮(当然其中有一些我可能能够使用但不知道用于我的其他帖子的东西)。
  • 会的。再次感谢!
  • 这种行为的原因是 WriteJson 方法 StringEnumConverter 做了string enumName = e.ToString();。幸运的是,您可以从 StringEnumConverter 派生您自己的 Converter 并覆盖 WriteJson(可能还有 ReadJson)方法。您需要在那里实现 EnumMember 值(或相应的 JSON 值)为空的所需行为。
  • @elgonzo 我认为这可能是解决方案,但乐观地认为可能有一种方法可以通过注释来实现这一点......谢谢。

标签: c# json.net


【解决方案1】:

我认为最简单的方法是使用自定义 StringEnumConverter

public class MyStringEnumConverter : Newtonsoft.Json.Converters.StringEnumConverter
{
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        if (value.Equals(InitialScanLevel.SystemDefault)) value = null;
        base.WriteJson(writer, value, serializer);
    }
}

[JsonConverter(typeof(MyStringEnumConverter))]
public enum InitialScanLevel
{
 .....
}

【讨论】:

  • 感谢@L.B,我认为可能是这样。我实现了您的解决方案,但略有不同,以适应具有相同怪异的其他枚举以及调用 StringEnumConverter.WriteJson() 而不是 base.WriteJson()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-15
  • 2013-09-09
  • 2013-12-04
  • 1970-01-01
  • 2017-06-16
  • 2014-12-11
  • 2010-10-05
相关资源
最近更新 更多