.NET Core API模型绑定失败求助:布尔值JSON转换异常
问题分析与解决方案
从你提供的错误日志和代码来看,核心问题非常明确:你发送的JSON中damaged和boxed字段是字符串值"No",但你的ReturnShipmentQueue模型里这两个字段是bool(布尔)类型,而.NET Core默认使用的System.Text.Json序列化器,没法自动把"Yes"/"No"这类字符串转换成布尔值,所以触发了模型绑定失败的错误。
另外还有几个容易忽略的字段名映射问题,也会导致部分属性绑定失败,我一起帮你梳理解决:
方案一:直接修正Postman发送的JSON(最简单快速)
这是新手最容易上手的解决方式,只需要调整JSON的两个地方:
- 把布尔类型字段的字符串值改成布尔值:
"No"→false,"Yes"→true - 修正字段名,让JSON字段和模型属性的命名匹配(默认.NET Core使用驼峰命名策略,模型的PascalCase属性对应JSON的camelCase字段)
修改后的JSON示例:
{ "pickupDate": "0001-01-01", "damaged": false, "boxed": false, "pieces": 0, "puaddress1": "123", "puaddress2": "", "puaddress3": "", "puzip": "12345", "pucity": "SomeCity", "pustate": "AB", "fkPonumber": 534560349, "createDate": "2019-06-06", "createdBy": "Me" }
说明:比如模型里的
PickupDate对应JSON的pickupDate,Pieces对应pieces,FkPonumber对应fkPonumber,这些命名匹配后才能正确绑定。
方案二:配置序列化器支持"Yes"/"No"转布尔值(如果无法修改JSON格式)
如果前端必须发送"Yes"/"No"这类字符串,你可以自定义一个JSON转换器,让序列化器能识别这类值:
1. 创建自定义布尔转换器
using System.Text.Json; using System.Text.Json.Serialization; namespace WebApplication12.Converters { public class YesNoBooleanConverter : JsonConverter<bool> { // 读取JSON时,把"Yes"/"No"转成bool public override bool Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { var value = reader.GetString(); // 忽略大小写,支持"yes"/"YES"/"No"等各种格式 return string.Equals(value?.Trim(), "Yes", StringComparison.OrdinalIgnoreCase); } // 写入JSON时,把bool转成"Yes"/"No"(可选,根据需求决定) public override void Write(Utf8JsonWriter writer, bool value, JsonSerializerOptions options) { writer.WriteStringValue(value ? "Yes" : "No"); } } }
2. 注册转换器到全局配置
如果你用的是.NET 6+,在Program.cs里添加配置:
builder.Services.AddControllers() .AddJsonOptions(options => { // 添加自定义转换器 options.JsonSerializerOptions.Converters.Add(new YesNoBooleanConverter()); // 保持默认的驼峰命名映射(可选,如果你需要模型PascalCase对应JSON camelCase) options.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase; });
或者你只想给特定属性应用转换器,直接在模型属性上加特性:
[JsonConverter(typeof(YesNoBooleanConverter))] public bool Damaged { get; set; } [JsonConverter(typeof(YesNoBooleanConverter))] public bool Boxed { get; set; }
额外注意:主键字段的绑定
你的模型主键是FkPonumber,而JSON里发送的是po字段,这会导致主键无法正确绑定。你可以二选一:
- 把JSON里的
po改成fkPonumber(对应方案一的修改) - 在模型属性上添加特性,指定JSON字段名:
[Key] [JsonPropertyName("po")] public long FkPonumber { get; set; }
内容的提问来源于stack exchange,提问作者Bmoe




