Jsonconverter 类型恢复为字段上的默认转换器?
Jsonconverter type to revert to default converter on a field?
我在 ASP.NET 核心 C# 解决方案中使用 System.Text.Json
,默认情况下,我启用了 JSON 字符串枚举转换器。但是,在少数字段上,我想 return 我的枚举作为基础 byte
/int
类型,而不必
- 将类型设置为 byte/int(我想保留它是枚举的事实)或;
- 从所有内容中删除 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"
}
我在 ASP.NET 核心 C# 解决方案中使用 System.Text.Json
,默认情况下,我启用了 JSON 字符串枚举转换器。但是,在少数字段上,我想 return 我的枚举作为基础 byte
/int
类型,而不必
- 将类型设置为 byte/int(我想保留它是枚举的事实)或;
- 从所有内容中删除 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"
}