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
相关产品推荐
相关产品推荐

