C#中如何配置JsonSerializer将int值1/0反序列化为bool类型
问题结论
可以实现。通过自定义JSON转换器即可兼容JSON中整型1/0到C# bool类型属性的反序列化,不需要修改原有业务类的属性类型。
实现方案(基于System.Text.Json,即示例中使用的内置
JsonSerializer) - 编写自定义bool类型JSON转换器,兼容数值、标准布尔值两种输入格式:
using System.Text.Json; using System.Text.Json.Serialization; public class BoolNumericConverter : JsonConverter<bool> { public override bool Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { return reader.TokenType switch { JsonTokenType.True => true, JsonTokenType.False => false, JsonTokenType.Number when reader.TryGetInt32(out int intVal) => intVal != 0, _ => throw new JsonException($"当前值{reader.TokenType}无法转换为布尔类型") }; } public override void Write(Utf8JsonWriter writer, bool value, JsonSerializerOptions options) { // 按需选择序列化输出规则:输出1/0用下一行,输出标准true/false则替换为 writer.WriteBooleanValue(value) writer.WriteNumberValue(value ? 1 : 0); } }
- 按需选择转换器的生效范围:
- 全局生效:所有bool属性都走该转换逻辑,反序列化时传入配置即可
var options = new JsonSerializerOptions { Converters = { new BoolNumericConverter() } }; // 执行反序列化 var result = JsonSerializer.Deserialize<Values>(json, options);- 单属性生效:仅指定属性走自定义转换,不影响其他bool字段
给目标属性添加[JsonConverter]特性即可,无需传入自定义options:
public class Values { [JsonConverter(typeof(BoolNumericConverter))] public bool BoolValue { get; set; } } // 直接调用默认反序列化方法即可正常转换 var result = JsonSerializer.Deserialize<Values>(json);
补充说明
- 该转换器默认兼容标准JSON布尔值
true/false的解析,不会破坏原有符合JSON规范的布尔字段反序列化逻辑 - 默认数值转换规则为「非0整型值转为
true,0转为false」,如果需要严格限制仅接受0/1作为合法输入,可以在数值解析分支增加校验,非0/1值直接抛出JsonException - 如果使用的是Newtonsoft.Json(Json.NET),实现逻辑一致,只需继承对应库的
JsonConverter抽象类实现相同的判断逻辑即可
内容的提问来源于stack exchange,提问作者Anastas Kostov
相关产品推荐
相关产品推荐

