C#自定义类JSON反序列化后无法使用foreach遍历的问题
解决JSON多Item反序列化与遍历问题
核心问题分析
你当前的ConfigurationFile类仅包含单个ItemInfo属性,无法匹配未来多Item#的JSON结构(本质是动态键的对象),因此无法直接用foreach遍历。要适配多Item场景,需将数据结构改为字典类型来接收这些动态键值对。
方案1:直接反序列化为字典(最简方案)
放弃ConfigurationFile类,直接将JSON反序列化为Dictionary<string, ItemInfo>,键对应Item1/Item2等字符串,值对应ItemInfo对象:
修改反序列化代码
// 直接反序列化为字典,无需ConfigurationFile类 var loadedItems = JsonConvert.DeserializeObject<Dictionary<string, ItemInfo>>(jsonConfig);
遍历处理代码
foreach (var itemEntry in loadedItems) { string itemName = itemEntry.Key; // 获取Item1、Item2等键名 ItemInfo itemData = itemEntry.Value; // 处理a、b、c字段 Console.WriteLine($"处理{itemName}: a={itemData.a}, b={itemData.b}"); if (itemData.c != null) { foreach (string cValue in itemData.c) { Console.WriteLine($" c字段值: {cValue}"); } } }
方案2:保留ConfigurationFile类并支持遍历
如果需要保留ConfigurationFile封装,可通过实现IEnumerable<T>和使用[JsonExtensionData]特性,让类自动接收所有动态Item#键:
修改类定义
using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System.Collections; using System.Collections.Generic; public class ConfigurationFile : IEnumerable<KeyValuePair<string, ItemInfo>> { private readonly Dictionary<string, ItemInfo> _items = new(); // JsonExtensionData特性:将JSON中未匹配到类属性的键值对存入字典 [JsonExtensionData] private Dictionary<string, JToken> _extensionData { get => _items.ToDictionary(k => k.Key, k => JToken.FromObject(k.Value)); set => _items = value.ToDictionary(k => k.Key, k => k.Value.ToObject<ItemInfo>()); } // 实现IEnumerable接口,支持foreach遍历 public IEnumerator<KeyValuePair<string, ItemInfo>> GetEnumerator() { return _items.GetEnumerator(); } IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } } public class ItemInfo { // 建议初始化避免null引用,C# 8+可用null包容运算符 public string a { get; set; } = ""; public string b { get; set; } = ""; public string[]? c { get; set; } }
反序列化与遍历代码
var loadedConfig = JsonConvert.DeserializeObject<ConfigurationFile>(jsonConfig); // 直接foreach遍历ConfigurationFile实例 foreach (var itemEntry in loadedConfig) { string itemName = itemEntry.Key; ItemInfo itemData = itemEntry.Value; // 处理逻辑同方案1 }
关键注意点
ItemInfo中的a和b属性建议添加默认值(如= ""),避免反序列化时出现NullReferenceException。- 两种方案都能兼容当前单Item和未来多Item的JSON结构,无需修改核心处理逻辑。
内容的提问来源于stack exchange,提问作者Vlad SD
相关产品推荐
相关产品推荐

