【问题标题】:Jsonconverter type to revert to default converter on a field?Jsonconverter 类型恢复为字段上的默认转换器?
【发布时间】:2021-04-26 19:22:16
【问题描述】:

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

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

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

【问题讨论】:

标签: c# asp.net .net-core system.text.json


【解决方案1】:

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

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));
    }
}

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

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

【讨论】:

  • 谢谢!这个和副本的链接是我想做的完美解决方案。
【解决方案2】:

我不会拒绝 int 解决方案。

这对消费者来说非常简单且非常清楚 - 枚举以数字形式出现也就不足为奇了。

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"
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多