You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

Angular项目中C# DataTable转指定JSON对象数组实现求助

解决DataTable转指定格式JSON数组的问题

我来帮你搞定这个需求!你想要的是把DataTable里的每一行转换成以列名为键、单元格值为对应值的JSON对象数组,对吧?看你之前的代码,问题出在这两个地方:

  • r.ItemArray序列化时,只会输出纯值的数组(比如["e101", "ravi", 1000]),不会带上列名作为键;
  • 直接序列化DataTable如果没得到预期结果,大概率是因为你可能误序列化了DataSet(而不是单独的DataTable),或者默认序列化设置带了额外的结构包装。

下面给你两种可靠的解决方案:

方案一:用LINQ自定义转换(灵活可控)

这种方法可以让你完全自定义每一行的输出结构,比如调整列名大小写、过滤特定列等:

// 假设dt是你的DataTable实例
var jsonString = JsonConvert.SerializeObject(
    dt.AsEnumerable().Select(row => 
        dt.Columns.Cast<DataColumn>()
                  .ToDictionary(
                      col => col.ColumnName.ToLower(), // 可自定义键名,比如转小写
                      col => row[col]
                  )
    ),
    Formatting.Indented // 可选,格式化JSON让它更易读
);

这段代码会遍历DataTable的每一行,把每一列的列名(转成小写)和对应单元格值做成字典,序列化后就会得到你想要的格式:

[
  {
    "eid": "e101",
    "ename": "ravi",
    "esal": 1000
  },
  {
    "eid": "e102",
    "ename": "ram",
    "esal": 2000
  },
  {
    "eid": "e103",
    "ename": "rajesh",
    "esal": 3000
  }
]

方案二:配置NewtonSoft直接序列化DataTable

如果你不需要自定义列名,直接用NewtonSoft的默认转换器也能得到正确结果,注意要序列化DataTable本身而不是DataSet

var settings = new JsonSerializerSettings
{
    Formatting = Formatting.Indented, // 可选格式化
    NullValueHandling = NullValueHandling.Ignore // 可选,忽略空值
};
// 直接序列化dt,而不是ds!
var jsonString = JsonConvert.SerializeObject(dt, settings);

这样输出的JSON结构和方案一一致,前提是你的DataTable列名已经是eidename这类小写格式,如果列名是大写的,方案一的自定义转换会更合适。

避坑提醒

  • 不要序列化DataSet(JsonConvert.SerializeObject(ds)),因为它会输出包含Tables嵌套结构的JSON,不是你要的纯对象数组;
  • 避免用ItemArray,它只返回行的纯值集合,丢失列名信息。

内容的提问来源于stack exchange,提问作者SilverFish

火山引擎 最新活动