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

C#使用JSON.Net序列化时移除Product类型空items数组的问题咨询

问题原因排查(ShouldSerialize不生效)

  • 首先确认你项目使用的序列化库:ShouldSerialize{PropertyName} 是 Newtonsoft.Json(Json.NET) 专属的条件序列化规则,如果你用的是.NET Core/5+ 自带的 System.Text.Json 序列化库,这个方法默认不会被识别,自然不会生效。
  • 如果你确实使用的是Newtonsoft.Json,检查序列化配置有没有开启忽略属性的全局规则,或者有没有给items属性加[JsonIgnore]等标记覆盖了条件序列化逻辑。
  • 另外你给出的业务代码存在变量名重复问题,foreach循环中已经声明了product变量,内部又定义了同名的Item product,会直接编译报错,需要修改变量名区分,比如改为Item item = new Item();。

方案1:修复序列化阶段的条件控制

如果你用Newtonsoft.Json,修正后即可生效

不需要改你现有的ShouldSerializeitems逻辑,只要确认序列化调用的是Newtonsoft的方法即可:

// 正确调用方式
var json = JsonConvert.SerializeObject(yourItemList, Formatting.Indented);

如果你用System.Text.Json,需要自定义转换器实现

public class ItemJsonConverter : JsonConverter<Item>
{
    public override Item Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        return JsonSerializer.Deserialize<Item>(ref reader, options);
    }

    public override void Write(Utf8JsonWriter writer, Item value, JsonSerializerOptions options)
    {
        writer.WriteStartObject();
        writer.WriteString(nameof(Item.Type), value.Type);
        writer.WriteNumber(nameof(Item.Order), value.Order);
        writer.WriteNumber(nameof(Item.id), value.id);
        writer.WriteString(nameof(Item.text), value.text);
        // 只有Type不是Product的时候才序列化items
        if (value.Type != "Product")
        {
            writer.WritePropertyName(nameof(Item.items));
            JsonSerializer.Serialize(writer, value.items, options);
        }
        writer.WriteEndObject();
    }
}

调用的时候把转换器加进去:

var options = new JsonSerializerOptions
{
    Converters = { new ItemJsonConverter() },
    WriteIndented = true
};
var json = JsonSerializer.Serialize(yourItemList, options);

方案2:JSON生成后移除指定属性

如果不想改序列化逻辑,可以把生成的JSON解析为JArray,遍历所有节点移除Product类型下的items属性:

using Newtonsoft.Json.Linq;

// 假设rawJson是你已经生成的JSON字符串
var jArray = JArray.Parse(rawJson);
// 递归遍历所有Item节点
void RemoveProductItems(JToken node)
{
    if (node.Type == JTokenType.Object)
    {
        var obj = (JObject)node;
        if (obj.Value<string>("Type") == "Product")
        {
            obj.Remove("items");
        }
        // 遍历子节点继续处理
        foreach (var child in obj.Children())
        {
            RemoveProductItems(child);
        }
    }
    else if (node.Type == JTokenType.Array)
    {
        foreach (var child in (JArray)node)
        {
            RemoveProductItems(child);
        }
    }
}
RemoveProductItems(jArray);
// 处理完再转成字符串
var processedJson = jArray.ToString(Newtonsoft.Json.Formatting.Indented);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 07:09:00