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

ASP.NET Core中AddSkillRequest JSON反序列化异常排查

问题原因

抛出的异常核心原因是:System.Text.Json使用构造函数反序列化时,要求每个构造函数参数必须与类的属性名称匹配(大小写不敏感)且类型可兼容。你的AddSkillRequest构造函数中,string skillCode参数对应的类属性是SkillCode? SkillCode(自定义值对象类型),序列化器无法将字符串直接映射到SkillCode类型,判定该参数没有匹配的属性,从而触发错误。

解决方案

推荐给自定义值对象SkillCode添加JSON转换器,让序列化器能正确处理字符串到SkillCode的转换,同时调整构造函数参数类型匹配属性:

1. 实现SkillCode的JSON转换器

using System.Text.Json;
using System.Text.Json.Serialization;

public class SkillCodeConverter : JsonConverter<SkillCode>
{
    // 反序列化:将JSON字符串转为SkillCode实例
    public override SkillCode Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        var codeValue = reader.GetString();
        return SkillCode.Create(codeValue); // 调用你的值对象创建方法
    }

    // 序列化:将SkillCode转为JSON字符串
    public override void Write(Utf8JsonWriter writer, SkillCode value, JsonSerializerOptions options)
    {
        writer.WriteStringValue(value.Value); // 假设SkillCode有一个Value属性存储字符串值
    }
}

2. 修改AddSkillRequest构造函数

将构造函数中的string skillCode参数改为SkillCode skillCode,直接赋值给属性:

public AddSkillRequest(
      Guid skillId,
      JsonDocument? skillName,
      SkillCode skillCode, // 调整参数类型为SkillCode
      JsonDocument? icon,
      JsonDocument? thumbnail,
      JsonDocument? image,
      int? displayOrder,
      bool? isActive,
      DateTime createdAt,
      Guid createdBy,
      DateTime updatedAt,
      Guid updatedBy)
{
    SkillId = skillId;
    SkillName = skillName;
    SkillCode = skillCode; // 直接赋值,无需再调用Create方法
    Icon = icon;
    Thumbnail = thumbnail;
    Image = image;
    DisplayOrder = displayOrder;
    IsActive = isActive;
    CreatedAt = createdAt;
    CreatedBy = createdBy;
    UpdatedAt = updatedAt;
    UpdatedBy = updatedBy;
}

3. 注册JSON转换器

在Program.cs中添加转换器到JSON配置:

builder.Services.AddControllers()
    .AddJsonOptions(options =>
    {
        options.JsonSerializerOptions.Converters.Add(new SkillCodeConverter());
    });
替代方案(不推荐)

如果暂时无法修改SkillCode,可以在AddSkillRequest中新增一个字符串属性接收JSON值,但会增加冗余代码:

public class AddSkillRequest
{
    // 新增属性用于接收JSON中的skillCode字符串
    public string SkillCodeInput { get; private set; }

    [JsonConstructor]
    public AddSkillRequest(
          Guid skillId,
          JsonDocument? skillName,
          string skillCodeInput,
          JsonDocument? icon,
          JsonDocument? thumbnail,
          JsonDocument? image,
          int? displayOrder,
          bool? isActive,
          DateTime createdAt,
          Guid createdBy,
          DateTime updatedAt,
          Guid updatedBy)
    {
        SkillId = skillId;
        SkillName = skillName;
        SkillCode = SkillCode.Create(skillCodeInput);
        Icon = icon;
        Thumbnail = thumbnail;
        Image = image;
        DisplayOrder = displayOrder;
        IsActive = isActive;
        CreatedAt = createdAt;
        CreatedBy = createdBy;
        UpdatedAt = updatedAt;
        UpdatedBy = updatedBy;
        SkillCodeInput = skillCodeInput;
    }

    // 其他属性不变...
}

此时JSON payload需要将原skillCode字段改为skillCodeInput。

内容的提问来源于stack exchange,提问作者mukesh rai

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 22:00:07