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列名已经是eid、ename这类小写格式,如果列名是大写的,方案一的自定义转换会更合适。
避坑提醒
- 不要序列化DataSet(
JsonConvert.SerializeObject(ds)),因为它会输出包含Tables嵌套结构的JSON,不是你要的纯对象数组; - 避免用
ItemArray,它只返回行的纯值集合,丢失列名信息。
内容的提问来源于stack exchange,提问作者SilverFish




