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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 19:10:33