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

System.Text.Json:如何将字符串"true"转换为布尔值

解决JSON字符串布尔值映射到C# bool属性的问题

嗨,我完全懂你的困扰——你收到的JSON里布尔值是以字符串形式(比如"true")存在的,想映射到C#的bool属性,但[JsonNumberHandling(JsonNumberHandling.AllowReadingFromString)]只处理数字转布尔的场景,确实不适用你这个情况,而且你说得对,之前标记的重复问题是整数转布尔,和你的需求根本不是一回事。

下面给你两种针对不同JSON序列化库的解决方案:

方案1:使用System.Text.Json(.NET Core/.NET 5+ 默认)

你需要自定义一个JsonConverter来处理字符串到bool的转换,实现起来很简单:

步骤1:编写自定义转换器

using System.Text.Json;
using System.Text.Json.Serialization;

public class StringToBoolConverter : JsonConverter<bool>
{
    public override bool Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        // 如果当前JSON token是字符串类型
        if (reader.TokenType == JsonTokenType.String)
        {
            var stringValue = reader.GetString();
            // 支持大小写不敏感的"true"/"false",也可以扩展支持"1"/"0"
            return !string.IsNullOrEmpty(stringValue) && 
                   (stringValue.Equals("true", StringComparison.OrdinalIgnoreCase) || stringValue == "1");
        }
        // 如果不是字符串, fallback 到默认的布尔值读取逻辑
        return reader.GetBoolean();
    }

    public override void Write(Utf8JsonWriter writer, bool value, JsonSerializerOptions options)
    {
        // 序列化时输出标准布尔值(可选:如果需要输出字符串形式,改成writer.WriteStringValue(value.ToString()))
        writer.WriteBooleanValue(value);
    }
}

步骤2:应用转换器

方式A:单独给属性加标记

public class MyModel
{
    [JsonConverter(typeof(StringToBoolConverter))]
    public bool Allow { get; set; }
}

方式B:全局注册(所有bool属性都生效)

var options = new JsonSerializerOptions();
options.Converters.Add(new StringToBoolConverter());

// 反序列化时使用这个options
var model = JsonSerializer.Deserialize<MyModel>(jsonString, options);

方案2:使用Newtonsoft.Json(Json.NET)

如果你用的是Newtonsoft.Json,其实它默认就支持将字符串形式的"true"/"false"(大小写不敏感)转换为bool类型,不需要额外配置。如果遇到特殊情况(比如自定义字符串值),同样可以写自定义转换器:

using Newtonsoft.Json;

public class StringToBoolConverterNewtonsoft : JsonConverter<bool>
{
    public override bool ReadJson(JsonReader reader, Type objectType, bool existingValue, bool hasExistingValue, JsonSerializer serializer)
    {
        if (reader.Value is string s)
        {
            return s.Equals("true", StringComparison.OrdinalIgnoreCase) || s == "1";
        }
        return Convert.ToBoolean(reader.Value);
    }

    public override void WriteJson(JsonWriter writer, bool value, JsonSerializer serializer)
    {
        writer.WriteValue(value);
    }
}

应用方式同样是给属性加[JsonConverter(typeof(StringToBoolConverterNewtonsoft))],或者全局注册到JsonSerializerSettings里。

这样处理后,不管JSON里的布尔值是"true"还是标准的true,都能正确映射到C#的bool属性啦。

内容的提问来源于stack exchange,提问作者Yossi Sternlicht

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 18:50:29