如何使用C#移除JSON中值为空、'-'、'N/A'的键
解决方法
你原来的代码仅处理了第一个空字符串匹配项,且未覆盖所有目标值和嵌套层级,以下是基于Newtonsoft.Json的正确实现:
核心思路
递归遍历JSON的所有层级,先收集所有值为''、'-'或'N/A'的JObject属性,最后统一移除这些属性(避免遍历过程中修改集合引发异常)。
完整代码实现
using Newtonsoft.Json.Linq; public static void RemoveTargetProperties(JToken token) { if (token.Type == JTokenType.Object) { var propsToRemove = new List<JProperty>(); foreach (JProperty prop in token.Children<JProperty>()) { // 递归处理子节点,确保深层属性被检查 RemoveTargetProperties(prop.Value); // 仅检查字符串类型的值,避免误删数字、布尔等类型属性 if (prop.Value.Type == JTokenType.String) { string val = prop.Value.Value<string>(); if (val == "" || val == "-" || val == "N/A") { propsToRemove.Add(prop); } } } // 统一移除符合条件的属性 foreach (var prop in propsToRemove) { prop.Remove(); } } else if (token.Type == JTokenType.Array) { // 如果需要移除数组中值为目标值的元素,可取消下方注释 // var itemsToRemove = token.Children().Where(t => t.Type == JTokenType.String && // (t.Value<string>() == "" || t.Value<string>() == "-" || t.Value<string>() == "N/A")).ToList(); // foreach (var item in itemsToRemove) // { // item.Remove(); // } foreach (JToken item in token.Children()) { RemoveTargetProperties(item); } } } // 使用示例 string jsonString = @"{""name"": {""first"": ""Robert"",""middle"": """",""last"": ""Smith""},""age"": 25,""DOB"": ""-"",""hobbies"": [""running"",""coding"",""-""],""education"": {""highschool"": ""N/A"",""college"": ""Yale""}}"; JObject json = JObject.Parse(jsonString); RemoveTargetProperties(json); string cleanedJson = json.ToString();
代码说明
- 递归遍历:覆盖所有嵌套的JObject和数组,确保深层属性也能被检查处理
- 先收集后移除:避免遍历JObject属性时直接修改集合导致的异常
- 类型校验:只处理字符串类型的值,不会误删数字(如示例中的
age:25)等其他类型属性 - 可选数组处理:若需要移除数组内符合条件的元素,可取消对应代码块的注释
处理后你的示例JSON会变为:
{"name":{"first":"Robert","last":"Smith"},"age":25,"hobbies":["running","coding","-"],"education":{"college":"Yale"}}
内容的提问来源于stack exchange,提问作者Praxusa
相关产品推荐
相关产品推荐

