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
相关产品推荐
相关产品推荐

