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

C# Json.NET序列化时隐藏指定类型对象的实现方案咨询

使用Json.NET序列化时隐藏指定对象的解决方案

针对你提出的两个序列化需求,结合Json.NET的特性可以通过自定义ContractResolver配合列表前置过滤来实现,以下是具体步骤:

先明确类结构(示例)

假设你的C#类定义如下:

public class Image
{
    public string Class { get; set; }
    public string Name { get; set; }
    public List<Layer> Layers { get; set; }
}

public class Layer
{
    public string DrawMode { get; set; }
    public Shape Shape { get; set; }
}

public abstract class Shape { }
public class Circle : Shape { /* 你的坐标属性 */ }
public class Rectangle : Shape { /* 你的坐标属性 */ }
public class Polygon : Shape { /* 你的坐标属性 */ }

需求1:隐藏所有Circle类型的Shape对象

通过继承DefaultContractResolver,重写CreateProperty方法,利用ShouldSerialize委托控制Layer.Shape属性的序列化条件:

public class ShapeFilterContractResolver : DefaultContractResolver
{
    protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
    {
        JsonProperty property = base.CreateProperty(member, memberSerialization);

        // 仅当Shape不是Circle类型时,才序列化该属性
        if (member.DeclaringType == typeof(Layer) && member.Name == nameof(Layer.Shape))
        {
            property.ShouldSerialize = instance =>
            {
                var layer = (Layer)instance;
                return layer.Shape is not Circle;
            };
        }

        return property;
    }
}

需求2:隐藏仅含Circle类型Shape的图片对象

在序列化前,先用Linq过滤掉所有Layers全为Circle Shape的图片:

// 过滤条件:图片中至少存在一个非Circle类型的Shape
var filteredImages = originalImages.Where(img => 
    img.Layers.Any(layer => layer.Shape is not Circle)
).ToList();

最终序列化代码

将两者结合,执行序列化:

var settings = new JsonSerializerSettings
{
    ContractResolver = new ShapeFilterContractResolver(),
    Formatting = Formatting.Indented // 可选,格式化输出JSON
};

string jsonResult = JsonConvert.SerializeObject(filteredImages, settings);

补充说明

  • 如果你想在序列化过程中自动过滤图片对象(而非前置Linq筛选),也可以自定义针对Image类的JsonConverter,在WriteJson方法中判断是否需要序列化当前图片,但前置Linq筛选的方式更直观高效。
  • DefaultContractResolver完全可以满足你的需求,核心是通过ShouldSerialize控制属性的可见性,配合列表过滤实现对象级别的隐藏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 06:33:35