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
相关产品推荐
相关产品推荐

