.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
相关产品推荐
相关产品推荐

