You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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);
    }
}
  • 按需选择转换器的生效范围:
    1. 全局生效:所有bool属性都走该转换逻辑,反序列化时传入配置即可
    var options = new JsonSerializerOptions
    {
        Converters = { new BoolNumericConverter() }
    };
    // 执行反序列化
    var result = JsonSerializer.Deserialize<Values>(json, options);
    
    1. 单属性生效:仅指定属性走自定义转换,不影响其他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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 23:24:25