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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 18:53:15