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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 17:52:35