从Newtonsoft迁移到System.Text.Json如何实现数字自动转布尔值
解决方案
System.Text.Json 未提供内置开关实现数字转布尔的兼容逻辑,需自行实现自定义转换器,步骤如下:
1. 实现自定义布尔转换器
using System.Text.Json; using System.Text.Json.Serialization; public class BooleanConverter : JsonConverter<bool> { public override bool Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { // 处理数字类型输入 if (reader.TokenType == JsonTokenType.Number) { return reader.GetInt32() != 0; } // 处理原生布尔类型输入 if (reader.TokenType == JsonTokenType.True || reader.TokenType == JsonTokenType.False) { return reader.GetBoolean(); } // 可选扩展:如果需要支持字符串格式的布尔值可自行添加对应逻辑 throw new JsonException($"无法将值 {reader.GetString()} 转换为布尔类型"); } public override void Write(Utf8JsonWriter writer, bool value, JsonSerializerOptions options) { // 序列化默认输出原生布尔值,符合接口规范要求 writer.WriteBooleanValue(value); // 若需要序列化时输出1/0格式,可替换为下方代码 // writer.WriteNumberValue(value ? 1 : 0); } }
2. 注册使用转换器
单次序列化/反序列化使用
var options = new JsonSerializerOptions(); options.Converters.Add(new BooleanConverter()); OutputState s1 = JsonSerializer.Deserialize<OutputState>(data, options);
ASP.NET Core 全局注册
在 Program.cs 中添加配置即可对所有接口生效:
builder.Services.AddControllers() .AddJsonOptions(options => { options.JsonSerializerOptions.Converters.Add(new BooleanConverter()); });
配置完成后,System.Text.Json 就会和 Newtonsoft.Json 行为一致:自动将数字0转为false,非0数字转为true,同时仍然支持原生的true/false布尔值输入,不影响符合规范的请求。
内容的提问来源于stack exchange,提问作者Phil K
相关产品推荐
相关产品推荐

