.NET Core使用Newtonsoft.Json反序列化时数字自动转布尔值问题求助
解决Newtonsoft.Json自动将数字转为布尔值的问题
问题描述
预期JSON中isUrgent字段为布尔类型:
{ // 其他字段 "isUrgent": true, // 其他字段 }
对应的C#模型定义如下:
using System.ComponentModel.DataAnnotations; using Newtonsoft.Json; public class RegisterObject { // 其他属性 [JsonProperty("isUrgent", Required = Required.Always)] public bool IsUrgent { get; set; } // 其他属性 }
当通过Postman发送包含任意数字的JSON(例如"isUrgent": 100)时,Newtonsoft.Json会自动将非零数字转换为布尔值true,导致不符合预期的请求被判定为有效。
解决方案
1. 为单个属性添加严格类型转换器
自定义一个JSON转换器,仅接受布尔类型的JSON值,否则抛出序列化异常:
public class StrictBooleanConverter : JsonConverter<bool> { public override bool ReadJson(JsonReader reader, Type objectType, bool existingValue, bool hasExistingValue, JsonSerializer serializer) { if (reader.TokenType == JsonToken.Boolean) { return (bool)reader.Value; } throw new JsonSerializationException($"属性仅接受布尔值(true/false),当前输入类型为{reader.TokenType}"); } public override void WriteJson(JsonWriter writer, bool value, JsonSerializer serializer) { writer.WriteValue(value); } }
在模型属性上应用该转换器:
[JsonProperty("isUrgent", Required = Required.Always)] [JsonConverter(typeof(StrictBooleanConverter))] public bool IsUrgent { get; set; }
2. 全局启用严格布尔解析
如果希望所有布尔类型的反序列化都遵循严格规则,在项目的JSON配置中启用内置的严格模式:
services.AddControllers() .AddNewtonsoftJson(options => { options.SerializerSettings.BooleanParseHandling = BooleanParseHandling.Strict; });
启用BooleanParseHandling.Strict后,Newtonsoft.Json仅接受JSON中的true/false布尔字面量,任何数字或其他类型的输入都会触发序列化异常。
3. 结合数据注解做后置验证
如果需要在转换后补充验证逻辑,可以添加RangeAttribute来限制输入:
[JsonProperty("isUrgent", Required = Required.Always)] [Range(typeof(bool), "true", "false", ErrorMessage = "isUrgent必须为布尔值true或false")] public bool IsUrgent { get; set; }
注意:此方法是在Newtonsoft.Json完成类型转换后进行验证,无法阻止数字转布尔的行为,但可以在API层面返回明确的错误提示。
内容的提问来源于stack exchange,提问作者Soraya Sánchez
相关产品推荐
相关产品推荐

