如何创建可接收指定JSON的C# Web API POST模型?
解决ASP.NET Core API接收特定JSON数据的模型创建问题
问题根源
你当前定义的ContentFormAnswerDto中,FormData字段被声明为string?类型,但请求JSON里的formData是嵌套的JSON对象而非字符串,导致JSON序列化器无法将对象解析为字符串,触发解析错误,进而引发整个DTO绑定失败(dto字段必填的错误是绑定失效后的连锁反应)。另外,WorkflowId字段设置了MinLength(36),但请求中该字段为空字符串,这也会触发验证错误。
解决方案
针对formData的动态键值对(键为带括号的UUID字符串,值可能是字符串或嵌套对象),可以选择以下适配方案:
方案1:用Dictionary<string, object>接收动态结构
将FormData定义为字典类型,自动映射formData里的所有键值对,嵌套对象会被解析为对应类型(System.Text.Json下为JsonElement,Newtonsoft.Json下为JObject):
public record ContentFormAnswerDto( [Required, MinLength(36), MaxLength(40)] string FormId, [MaxLength(40)] string? WorkflowId = null, string? Status = null, Dictionary<string, object>? FormData = null );
方案2:用JsonElement保留原始JSON结构
如果不需要提前解析键值对,仅需接收完整的formData内容,可使用JsonElement类型:
public record ContentFormAnswerDto( [Required, MinLength(36), MaxLength(40)] string FormId, [MaxLength(40)] string? WorkflowId = null, string? Status = null, JsonElement? FormData = null );
后续可通过JsonElement的API遍历、读取内部的键值对数据。
补充说明
- 移除了
WorkflowId的MinLength(36)约束,因为请求中该字段允许为空字符串,原约束会导致验证失败; - ASP.NET Core默认的System.Text.Json序列化器已支持上述两种类型的解析,无需额外配置。
内容的提问来源于stack exchange,提问作者Bheksta
相关产品推荐
相关产品推荐

