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

.NET 7 Web API如何正确反序列化嵌套结构的请求体?

问题原因及解决方案

核心问题

你的代码存在两个关键问题导致反序列化失败:

  1. ArticleRequest中的Article是字段而非属性:默认JSON序列化器(如System.Text.Json)仅处理公共属性,不会自动绑定公共字段,因此请求中的article数据无法映射到该字段。
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 03:07:34