.NET 6控制器接收List<Word>集合参数时JSON转换失败及必填字段错误问题排查与解决
嘿,我来帮你梳理下这个问题,你遇到的两个错误其实是同一个根源导致的,咱们一步步拆解解决:
问题原因分析
JSON格式与参数类型不匹配
你的控制器方法里用[FromBody]修饰的是List<Word>类型,这意味着ASP.NET Core期望请求体直接是一个JSON数组。但你在Postman里传的是一个包含wordList键的JSON对象,框架无法把外层的对象转换成List<Word>类型,所以抛出了The JSON value could not be converted to System.Collections.Generic.List1[EnglishStudy.Entity.Word]`的错误。必填字段误报
因为框架没从请求体里正确解析到wordList参数(它期望直接接收数组,而不是带键的对象),所以误以为这个参数缺失,进而报出The wordList field is required.的错误。
解决方法(两种可选方案)
方案一:修改Postman请求体为直接数组(推荐)
既然你的方法参数定义就是接收List<Word>,那直接把请求体改成纯数组格式即可,不需要外层的wordList键:
[ { "words": "a", "phonetic": "a", "paraphrase": " art.一(个) 每一(个)" } ]
发送这个请求后,框架就能自动把JSON数组转换成List<Word>对象,正确绑定到方法参数上。
方案二:用DTO类包裹集合(保持原有请求体结构)
如果你需要保留当前的请求体格式(外层带wordList键),可以创建一个DTO类来封装这个集合:
// 新增的DTO类 namespace EnglishStudy.Entity { public class WordListRequest { public List<Word> WordList { get; set; } } }
然后修改控制器方法的参数类型:
[HttpPost("addlist/{type}")] public Result AddWord([FromBody] WordListRequest request, int type = 1) { var count = wordService.AddWord(request.WordList, type); return result.Ok(count); }
这样Postman原来的JSON格式就能被正确解析,request.WordList就能拿到你传入的集合数据。
额外小提示
注意到你的Word类属性是首字母大写的(比如Words),而JSON里用的是小写键(比如words)。虽然ASP.NET Core 6默认的JSON序列化配置是不区分大小写的,但如果之后遇到属性绑定不上的情况,可以手动在Program.cs里明确配置:
builder.Services.AddControllers() .AddJsonOptions(options => { // 开启属性名称不区分大小写匹配 options.JsonSerializerOptions.PropertyNameCaseInsensitive = true; });
备注:内容来源于stack exchange,提问作者大白兔

