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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 15:54:05