使用C#处理JSON:如何从列表模型中移除子列表
解决C#模型序列化JSON时移除空/Null子列表的问题
这个问题我之前处理JSON序列化时也碰到过——明明把subItem设为null了,结果JSON里还是输出"subItem": [],核心原因是默认的JSON序列化行为会把空集合(或被初始化过的空列表)处理成[],而不是直接忽略该属性。下面分两种常用的JSON序列化库给你具体解决方案:
一、使用Newtonsoft.Json(Json.NET)
这是.NET生态里应用最广泛的JSON库之一,有两种方式可以实现需求:
1. 全局配置序列化规则
在序列化时指定JsonSerializerSettings,让null值和默认值(空列表属于集合类型的默认值)都不被序列化:
// 实例化目标数据对象 var targetItem = new lineItems { item_name = "第二个item", quantity = 2, price = "99.9", subItem = null // 务必设为null,而不是仅清空列表 }; // 配置序列化选项 var settings = new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore, // 忽略值为null的属性 DefaultValueHandling = DefaultValueHandling.Ignore // 忽略取默认值的属性(比如空列表) }; // 执行序列化 string jsonResult = JsonConvert.SerializeObject(targetItem, settings);
2. 给属性单独加特性
如果不想全局修改配置,可以直接在subItem属性上添加特性,指定该属性的序列化规则:
public class lineItems { public string item_name { get; set; } public int quantity { get; set; } public string price { get; set; } [JsonProperty(NullValueHandling = NullValueHandling.Ignore, DefaultValueHandling = DefaultValueHandling.Ignore)] public List<subItem> subItem { get; set; } }
二、使用System.Text.Json(.NET Core/.NET 5+ 默认库)
如果你用的是.NET Core或更高版本的内置JSON序列化库,可以这样设置:
1. 全局配置序列化选项
var targetItem = new lineItems { item_name = "第二个item", quantity = 2, price = "99.9", subItem = null }; var options = new JsonSerializerOptions { // 当属性为null或取默认值(空列表)时忽略该属性 DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull | JsonIgnoreCondition.WhenWritingDefault }; string jsonResult = JsonSerializer.Serialize(targetItem, options);
2. 给属性单独加特性
同样可以给subItem属性添加特性来控制序列化行为:
public class lineItems { public string item_name { get; set; } public int quantity { get; set; } public string price { get; set; } [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingDefault)] public List<subItem> subItem { get; set; } }
关键注意事项
一定要检查你的lineItems类有没有在构造函数里默认初始化subItem列表:
// 如果存在这样的构造函数,需特别注意 public lineItems() { subItem = new List<subItem>(); // 默认实例化了空列表 }
这种情况下,如果你只是调用subItem.Clear(),序列化后还是会输出[];必须显式设置subItem = null,再配合上面的序列化配置,才能让该属性从JSON中消失。
内容的提问来源于stack exchange,提问作者Mina
相关产品推荐
相关产品推荐

