【问题标题】: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 类型返回,而不必
- 将类型设置为字节/整数(我想保留它是枚举的事实)或;
- 从所有内容中删除 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"
}