如何使用JSON.net序列化枚举为空值

本文关键字:枚举 空值 序列化 net 何使用 JSON | 更新日期: 2023-09-27 18:15:34

我正在使用第三方REST API,其中一个字段(类型string)具有一组已知的值,我在代码中将其建模为enum。从JSON获取StringEnumConverter。NET正确序列化所有这些值,除了[EnumMemberAttribute]注释所描述的一个值。对于这个字段,REST API将null值转换为第三方系统中的"系统默认值";然而,当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是(不是第三方API期望的)

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

但应该是

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

对于InitialScanLevel.DeepDiscovery,结果JSON是(这是第三方API期望的)

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

如何使用JSON.net序列化枚举为空值

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