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

如何用C#遍历嵌套JSON并保留指定列表中的键

C# 递归清理多层嵌套JSON,仅保留指定键值对

要处理多层嵌套的JSON结构,核心是递归遍历所有层级的对象和数组,逐一检查键是否在允许的集合中,移除不符合要求的键值对。下面是基于Newtonsoft.Json(C#最常用的JSON处理库)的实现方案:

核心实现代码

using Newtonsoft.Json.Linq;
using System.Collections.Generic;

public static class JsonCleaner
{
    // 递归清理JSON,仅保留allowedKeys中的键
    public static void CleanJson(JToken token, HashSet<string> allowedKeys)
    {
        // 处理JSON对象
        if (token is JObject jObject)
        {
            // 先收集要移除的键,避免遍历中修改集合抛异常
            var keysToRemove = new List<string>();
            foreach (var prop in jObject.Properties())
            {
                if (!allowedKeys.Contains(prop.Name))
                {
                    keysToRemove.Add(prop.Name);
                }
                else
                {
                    // 递归处理当前键对应的深层值
                    CleanJson(prop.Value, allowedKeys);
                }
            }
            // 批量移除不符合要求的键
            foreach (var key in keysToRemove)
            {
                jObject.Remove(key);
            }
        }
        // 处理JSON数组
        else if (token is JArray jArray)
        {
            // 遍历数组每个元素,递归处理
            foreach (var item in jArray)
            {
                CleanJson(item, allowedKeys);
            }
        }
        // 字符串、数字、布尔等叶子节点无需处理
    }
}

使用示例

// 待处理的嵌套JSON
string rawJson = @"
{
    ""ID"": 123,
    ""Name"": ""Test"",
    ""Details"": {
        ""Age"": 25,
        ""EX-1"": ""Extra"",
        ""Address"": {
            ""Street"": ""Main St"",
            ""ID"": 456
        }
    },
    ""Items"": [
        {
            ""ID"": 789,
            ""Value"": ""Item1""
        },
        {
            ""EX-1"": ""ExtraItem"",
            ""Value"": ""Item2""
        }
    ]
}";

// 指定允许保留的键集合(用HashSet提升查找效率)
var allowedKeys = new HashSet<string> { "Name", "Age", "Address", "Street", "Items", "Value" };

// 解析JSON并清理
JToken jsonToken = JToken.Parse(rawJson);
JsonCleaner.CleanJson(jsonToken, allowedKeys);

// 输出处理后的结果
string cleanedJson = jsonToken.ToString();
Console.WriteLine(cleanedJson);

关键细节说明

  1. 递归遍历:不管JSON嵌套多少层,只要是JObject或JArray类型,就会递归处理内部元素,确保没有遗漏。
  2. HashSet优化查找:用HashSet<string>存储允许的键,比List<string>的Contains方法效率更高,适合频繁检查的场景。
  3. 避免集合修改异常:处理JObject时,先把要移除的键收集到临时列表,遍历完成后再批量移除,防止遍历过程中修改集合引发异常。
  4. 覆盖所有场景:同时处理对象和数组,不管是嵌套对象里的数组,还是数组里的嵌套对象,都能正确处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 04:30:27