.NET 7 Web API如何正确反序列化嵌套结构的请求体?
问题原因及解决方案
核心问题
你的代码存在两个关键问题导致反序列化失败:
- ArticleRequest中的Article是字段而非属性:默认JSON序列化器(如System.Text.Json)仅处理公共属性,不会自动绑定公共字段,因此请求中的
article数据无法映射到该字段。 - Article类的属性setter私有:默认序列化器无法直接为私有setter的属性赋值,即使字段改属性,Article实例的属性仍会是null。
分步解决
1. 将ArticleRequest的字段改为属性
把公共字段替换为公共属性,确保序列化器能识别并绑定数据:
public class ArticleRequest { public Article? Article { get; set; } }
2. 处理Article的私有setter问题
有两种常用方案可选:
方案一:添加匹配的构造函数(推荐,保持不可变性)
给Article添加与属性对应的参数构造函数,序列化器会自动匹配参数名(大小写不敏感)完成初始化:
public class Article { public string Title { get; private set; } public string Description { get; private set; } public string Body { get; private set; } public Article(string title, string description, string body) { Title = title; Description = description; Body = body; } }
如果使用.NET 6+,可以用init关键字替代私有set,兼顾不可变性和序列化兼容性:
public class Article { public string Title { get; init; } public string Description { get; init; } public string Body { get; init; } }
方案二:配置序列化器允许访问私有setter
可以全局配置或单独给属性标注,让序列化器有权限修改私有setter的属性:
全局配置(Program.cs):
builder.Services.AddControllers() .AddJsonOptions(options => { options.JsonSerializerOptions.PropertyNameCaseInsensitive = true; // 允许序列化器访问私有setter options.JsonSerializerOptions.PropertyAccessMode = JsonPropertyAccessMode.Private; });
单独属性标注:
using System.Text.Json.Serialization; public class Article { [JsonPropertyName("title")] public string Title { get; private set; } = string.Empty; [JsonPropertyName("description")] public string Description { get; private set; } = string.Empty; [JsonPropertyName("body")] public string Body { get; private set; } = string.Empty; }
注意:给属性赋默认值(如string.Empty)可避免空引用问题。
验证
修改完成后,发送符合格式的POST请求,就能正确接收并反序列化数据,接口返回的对象将包含请求中的内容。
内容的提问来源于stack exchange,提问作者user8084633
相关产品推荐
相关产品推荐

