c# - 如何使用 JSON.net 将枚举序列化为空值

标签 c# json.net

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

我在代码中定义的枚举:

[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...
}

最佳答案

我认为最简单的方法是使用自定义 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
{
 .....
}

关于c# - 如何使用 JSON.net 将枚举序列化为空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25041462/

相关文章:

c# - 如何设置我的矩形的不透明度(绘图上下文)

c# - 在图表控件上显示鼠标轴坐标

c# - 如何使用 JPath 选择具有指定值的子项的集合项?

c# - Json.net `JsonConstructor` 构造函数参数名

javascript - 具有多个 key 对的 JSON 的适当数据结构

c# - 来自 MYSQL Membership Provider 的自定义成员资格提供程序

c# - 模拟成员变量

c# - 同一数据库中的两个 IdentityDbContext

c# - 使用 JsonReader 而不是 JsonSerializer 时自定义 JsonConverter 不起作用

c# - JSON.net 缺少属性的默认值