You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

.NET Core API模型绑定失败求助:布尔值JSON转换异常

问题分析与解决方案

从你提供的错误日志和代码来看,核心问题非常明确:你发送的JSON中damagedboxed字段是字符串值"No",但你的ReturnShipmentQueue模型里这两个字段是bool(布尔)类型,而.NET Core默认使用的System.Text.Json序列化器,没法自动把"Yes"/"No"这类字符串转换成布尔值,所以触发了模型绑定失败的错误。

另外还有几个容易忽略的字段名映射问题,也会导致部分属性绑定失败,我一起帮你梳理解决:


方案一:直接修正Postman发送的JSON(最简单快速)

这是新手最容易上手的解决方式,只需要调整JSON的两个地方:

  1. 把布尔类型字段的字符串值改成布尔值:"No"false"Yes"true
  2. 修正字段名,让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的pickupDatePieces对应piecesFkPonumber对应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

火山引擎 最新活动