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

Newtonsoft.Json:如何在序列化时忽略列表中的特定OpeningHours对象

方案1:重写ContractResolver的CreateArrayContract(推荐)

你之前的方案失效是因为CreateProperty仅负责定义类成员属性的序列化规则,无法作用于集合内的独立元素,改用CreateArrayContract处理集合契约即可实现集合元素过滤,完全复用所有全局序列化配置:

protected override JsonArrayContract CreateArrayContract(Type objectType)
{
    var arrayContract = base.CreateArrayContract(objectType);
    // 只匹配元素为OpeningHours类型的集合
    if (arrayContract.CollectionItemType == typeof(OpeningHours))
    {
        arrayContract.ShouldSerialize = (parentObj, itemObj) => 
        {
            var openingHours = itemObj as OpeningHours;
            // 虚拟类型直接跳过序列化
            return openingHours?.Type != OpeningHoursType.Virtual;
        };
    }
    return arrayContract;
}

原有CreateProperty的逻辑不需要修改,保留即可,该方案全局生效,无需修改业务代码或加额外特性。

方案2:自定义Converter复用全局配置

如果你更倾向用Converter实现,可以直接用方法传入的JsonSerializer实例执行序列化,自动继承所有全局配置(驼峰命名、忽略默认值等),不需要自己实现序列化逻辑:

public class OpeningHoursFilterConverter : JsonConverter<OpeningHours>
{
    public override void WriteJson(JsonWriter writer, OpeningHours value, JsonSerializer serializer)
    {
        // 虚拟类型不输出
        if (value.Type == OpeningHoursType.Virtual)
            return;
        // 调用默认序列化逻辑,复用全局配置
        serializer.Serialize(writer, value);
    }

    public override OpeningHours ReadJson(JsonReader reader, Type objectType, OpeningHours existingValue, bool hasExistingValue, JsonSerializer serializer)
    {
        return serializer.Deserialize<OpeningHours>(reader);
    }
}

注意不要在Converter内部自行实例化新的JsonSerializer,直接用参数传入的实例即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.20 01:57:01