C#反序列化JSON到DataTable时Datum无GetEnumerator报错求助
问题根因
你遇到的两个问题核心原因如下:
- 报错
type Datum does not contain a public instance or extension definition for getEnumerator:你在代码中对单个Datum类实例执行了foreach遍历操作,只有实现了IEnumerable接口的集合类型才支持foreach遍历,单个实体对象不支持该操作。 - 目标列仅显示0:反序列化后的JSON数据没有正确赋值到DataTable对应列,通常是反序列化结果读取错误、类属性与JSON键不匹配、DataTable列类型与属性类型不匹配三类原因导致。
修复方案
1. 修正模型类定义
确保模型类和JSON结构完全匹配,JSON外层如果是包含数组的对象,需要先定义根模型,示例如下(适配Newtonsoft.Json和System.Text.Json两种序列化库):
// 根模型对应JSON最外层结构 public class JsonRoot { // 特性中的字符串要和JSON里存储数据的数组键名完全一致 [Newtonsoft.Json.JsonProperty("data")] [System.Text.Json.Serialization.JsonPropertyName("data")] public List<Datum> DataItems { get; set; } } // Datum类对应数组内的单个对象 public class Datum { // 每个属性对应JSON内单个字段,确保属性为public,类型和JSON字段匹配 [Newtonsoft.Json.JsonProperty("字段1")] [System.Text.Json.Serialization.JsonPropertyName("字段1")] public int 字段1 { get; set; } [Newtonsoft.Json.JsonProperty("字段2")] [System.Text.Json.Serialization.JsonPropertyName("字段2")] public string 字段2 { get; set; } // 按实际JSON字段补充剩余属性 }
2. 修正反序列化与绑定逻辑
// 读取JSON文件内容 string jsonText = File.ReadAllText("你的JSON文件全路径"); // 反序列化到根模型,不要直接反序列化为Datum类型 // Newtonsoft.Json写法: JsonRoot root = Newtonsoft.Json.JsonConvert.DeserializeObject<JsonRoot>(jsonText); // System.Text.Json写法: // JsonRoot root = System.Text.Json.JsonSerializer.Deserialize<JsonRoot>(jsonText); // 遍历集合属性而非单个Datum对象,避免枚举错误 foreach (Datum item in root.DataItems) { DataRow row = 你的DataTable实例.NewRow(); // 赋值时确保DataTable列名和类属性对应,类型匹配 row["你的DataTable列名1"] = item.字段1; row["你的DataTable列名2"] = item.字段2; 你的DataTable实例.Rows.Add(row); } // 刷新DataGridView绑定 你的DataGridView实例.DataSource = null; 你的DataGridView实例.DataSource = 你的DataTable实例;
3. 简化方案(无需手动维护DataTable)
如果不需要自定义DataTable逻辑,可以直接把反序列化得到的集合绑定到DataGridView,省略手动转DataTable的步骤:
你的DataGridView实例.DataSource = root.DataItems;
排查校验点
- 反序列化后打断点校验
root.DataItems的元素数量,数量为0说明JSON结构和模型类不匹配,逐字段核对键名、类型 - 校验DataTable列类型和Datum属性类型是否一致,例如JSON字段为字符串但DataTable列设为int类型,会自动转换为默认值0
- 确认读取的JSON文件路径正确,文件内容格式合法
内容的提问来源于stack exchange,提问作者Joe Fisher
相关产品推荐
相关产品推荐

