Newtonsoft Json如何序列化深度嵌套对象的指定选中属性?
Newtonsoft.Json 完全支持这两种定制化序列化需求,不需要修改原有模型定义,以下是具体实现方案:
需求1:根节点仅保留children属性,子层级所有节点保留全部属性
通过自定义 IContractResolver 实现,仅对根层级的Node对象做属性过滤,子层级正常返回所有属性:
public class RootOnlyChildrenResolver : DefaultContractResolver { private int _serializeDepth = 0; protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization) { var properties = base.CreateProperties(type, memberSerialization); // 仅过滤根层级的Node类型属性 if (_serializeDepth == 0 && type == typeof(Node)) { properties = properties.Where(p => p.PropertyName == nameof(Node.children)).ToList(); } _serializeDepth++; return properties; } }
调用方法:
var serializeSettings = new JsonSerializerSettings { ContractResolver = new RootOnlyChildrenResolver(), Formatting = Formatting.Indented }; // rootNode为你构造的树形结构根对象 string resultJson = JsonConvert.SerializeObject(rootNode, serializeSettings);
需求2:仅序列化根节点下直接子节点的id属性
通过自定义 JsonConverter 实现,精准控制每个层级的输出内容:
public class OnlyChildrenIdConverter : JsonConverter { private int _serializeDepth = 0; public override bool CanConvert(Type objectType) { return objectType == typeof(Node); } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { var node = (Node)value; writer.WriteStartObject(); if (_serializeDepth == 0) { // 根节点仅输出children属性 writer.WritePropertyName(nameof(Node.children)); if (node.children == null) { writer.WriteNull(); } else { writer.WriteStartArray(); _serializeDepth++; foreach (var child in node.children) { // 直接子节点仅输出id writer.WriteStartObject(); writer.WritePropertyName(nameof(Node.id)); writer.WriteValue(child.id); writer.WriteEndObject(); } _serializeDepth--; writer.WriteEndArray(); } } writer.WriteEndObject(); } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { throw new NotImplementedException("该Converter仅用于序列化场景"); } }
调用方法:
var serializeSettings = new JsonSerializerSettings { Converters = new List<JsonConverter> { new OnlyChildrenIdConverter() }, Formatting = Formatting.Indented }; string resultJson = JsonConvert.SerializeObject(rootNode, serializeSettings);
如果有更复杂的层级过滤需求,只需要调整上述实现中的层级判断、属性过滤逻辑即可,不需要修改原有业务模型代码。
内容的提问来源于stack exchange,提问作者netcoredev
相关产品推荐
相关产品推荐

