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

C#反序列化JSON到DataTable时Datum无GetEnumerator报错求助

问题根因

你遇到的两个问题核心原因如下:

  1. 报错type Datum does not contain a public instance or extension definition for getEnumerator:你在代码中对单个Datum类实例执行了foreach遍历操作,只有实现了IEnumerable接口的集合类型才支持foreach遍历,单个实体对象不支持该操作。
  2. 目标列仅显示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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 15:06:04