如何用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);
关键细节说明
- 递归遍历:不管JSON嵌套多少层,只要是JObject或JArray类型,就会递归处理内部元素,确保没有遗漏。
- HashSet优化查找:用
HashSet<string>存储允许的键,比List<string>的Contains方法效率更高,适合频繁检查的场景。 - 避免集合修改异常:处理JObject时,先把要移除的键收集到临时列表,遍历完成后再批量移除,防止遍历过程中修改集合引发异常。
- 覆盖所有场景:同时处理对象和数组,不管是嵌套对象里的数组,还是数组里的嵌套对象,都能正确处理。
内容的提问来源于stack exchange,提问作者DeLorean
相关产品推荐
相关产品推荐

