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

.NET 6中如何根据条件动态返回响应中的Client子对象?

问题解决:根据条件控制System.Text.Json序列化时是否包含Client字段

崩溃原因分析

你程序崩溃的核心原因是Response类中client属性的getter实现存在无限递归调用:

get { return WithClientInfo == "J" ? client : null; }

这里的client会再次触发该属性的getter,导致栈溢出。

解决方案

方案1:修复属性的递归问题(保留属性逻辑)

修改Response类,使用私有字段存储ClientResponse的实际值,避免递归调用:

public class Response
{
    [JsonPropertyName("number")]
    public int? number { get; set; }

    [JsonIgnore]
    public string WithClientInfo { get; set; }

    // 私有字段存储ClientResponse实例
    private ClientResponse _client;

    [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingDefault)]
    public ClientResponse client
    {
        get 
        { 
            // 根据WithClientInfo决定返回实例还是null
            return WithClientInfo == "J" ? _client : null; 
        }
        set 
        { 
            _client = value; 
        }
    }
}

同时修正查询语句中的属性名大小写(C#大小写敏感,类中属性为小写client,需与赋值语句匹配):

var query = from table1 in _unitOfWork.table1.All(_pageParameters)
            from table2 in _unitOfWork.table2.All(null).Where(x => x.Nr_X == table1.Nr_X).DefaultIfEmpty()
            from table3 in _unitOfWork.table3.All(null).Where(x => x.Nr_Y == table1.Nr_Y).DefaultIfEmpty()
            select new Response
            {
                number = table1.Nr_X,
                WithClientInfo = "N", // 根据业务逻辑设置"J"或"N"
                client = new ClientResponse
                {
                    // 填充ClientResponse字段
                }
            };

方案2:查询阶段直接控制(更直观)

如果不需要在属性中封装逻辑,可以简化Response类,直接在查询时根据条件决定是否赋值client:

public class Response
{
    [JsonPropertyName("number")]
    public int? number { get; set; }

    [JsonIgnore]
    public string WithClientInfo { get; set; }

    [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingDefault)]
    public ClientResponse client { get; set; }
}

查询时根据条件动态赋值:

var query = from table1 in _unitOfWork.table1.All(_pageParameters)
            from table2 in _unitOfWork.table2.All(null).Where(x => x.Nr_X == table1.Nr_X).DefaultIfEmpty()
            from table3 in _unitOfWork.table3.All(null).Where(x => x.Nr_Y == table1.Nr_Y).DefaultIfEmpty()
            // 定义是否需要包含Client的条件
            let includeClient = /* 替换为你的业务判断逻辑,例如:table1.NeedClientInfo == "J" */
            select new Response
            {
                number = table1.Nr_X,
                WithClientInfo = includeClient ? "J" : "N",
                client = includeClient ? new ClientResponse
                {
                    // 填充ClientResponse字段
                } : null
            };

原理说明

[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingDefault)]会在序列化时自动忽略值为默认值的字段:

  • 引用类型的默认值是null,所以当client为null时,不会出现在最终的JSON响应中;
  • 当client有实例时,会正常序列化输出。

内容的提问来源于stack exchange,提问作者user3552264

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 10:16:18