Jsonconverter 类型恢复为字段上的默认转换器?

Jsonconverter type to revert to default converter on a field?

我在 ASP.NET 核心 C# 解决方案中使用 System.Text.Json,默认情况下,我启用了 JSON 字符串枚举转换器。但是,在少数字段上,我想 return 我的枚举作为基础 byte/int 类型,而不必

  1. 将类型设置为 byte/int(我想保留它是枚举的事实)或;
  2. 从所有内容中删除 JSON 字符串枚举转换器。

有没有办法在特定字段上使用 [JsonConverter(type)] 来强制枚举输出为 byte/int 而不是字符串?

您可以使用自定义转换器,例如:

public class JsonIntEnumConverter<T> : JsonConverter<T> where T : Enum
{
    public override T Read(ref Utf8JsonReader reader, Type typeToConvert, 
        JsonSerializerOptions options)
    {
        throw new NotImplementedException();
    }

    public override void Write(Utf8JsonWriter writer, T value, JsonSerializerOptions options)
    {
        Enum test = (Enum)Enum.Parse(typeof(T), value.ToString());
        writer.WriteNumberValue(Convert.ToInt32(test));
    }
}

现在在您 class 中,任何您想保留为 int 的属性,只需添加 JsonConverter 属性:

[JsonConverter(typeof(JsonIntEnumConverter<MyEnum>))]
public MyEnum SomeValue { get; set; }

我不会拒绝 int 解决方案。

这对消费者来说非常简单明了 - enum 以数字形式出现也就不足为奇了。

public enum Number { Zero, One, Two, Three };
public class X
{
    [JsonIgnore]
    public Number N { get; set; }

    public int NVal => (int)N;

    public Number N2 { get; set; }        
}

然后

var o = new X { N = Number.One, N2 = Number.Two };

var serializeOptions = new JsonSerializerOptions
{
    WriteIndented = true,
    Converters = { new JsonStringEnumConverter() }
};

Console.WriteLine(JsonSerializer.Serialize(o, serializeOptions));

结果是:

{
  "NVal": 1,
  "N2": "Two"
}