如何将特定结构CSV转换为图表控件所需的JSON格式?
问题描述
我需要将CSV文件转换为特定格式的JSON(用于图表控件),目标JSON格式如下:
var dataRetrievedfromCSV = [ { "datalabel": "Humidity", "time": "1:54", "value": 78.4 }, { "datalabel": "Temperature", "time": "1:00", "value": 9.2 }, { "datalabel": "Temperature", "time": "2:12", "value": 16.4 }, { "datalabel": "Humidity", "time": "2:30", "value": 78.2 } ];
CSV的格式规则:最左侧列是时间,首行是表头(对应datalabel的内容)。我已经成功把CSV解析成了DataTable,但不知道怎么把DataTable转成上面要求的JSON结构。直接序列化DataTable得到的格式不符合要求,现在卡在了代码的后半部分(构建目标对象列表)。
我的当前代码:
public ActionResult GraphResults(string filePathT, int testNumber) { string filePath = filePathT; DataTable dt = new DataTable(); TextReader reader = new StreamReader(filePath); List<object> graphItems = new List<object>(); using (TextFieldParser parser = new TextFieldParser(filePath)) { parser.TextFieldType = FieldType.Delimited; parser.SetDelimiters(","); bool firstRow = true; while (!parser.EndOfData) { string[] currentRow = parser.ReadFields(); if (firstRow) //check for header row { foreach (string fields in currentRow) { dt.Columns.Add(fields, typeof(string)); } continue; } //Create new data rows under header DataRow dr = dt.NewRow(); dt.Rows.Add(dr); for (int c = 0; c < currentRow.Count(); c++) { dr[c] = currentRow[c]; } } } //once we have the datatable, attempt to organize for CSV? foreach(DataRow row in dt.Rows) { foreach(DataColumn col in dt.Columns) { graphItems.Add(new { VALS = new { datalabel = ?, time = ?, value = ? } }; }) } }
解决方案
调整DataTable的遍历逻辑即可,核心思路是:每行的第一列是时间,剩下的每一列对应一个datalabel(列名)和value(当前行该列的数值),具体修改如下:
- 先取出每行第一列的值作为
time; - 遍历除第一列外的所有列,用列名作为
datalabel,将列值转为数值类型作为value; - 直接创建符合目标结构的匿名对象,不需要嵌套
VALS层级。
修改后的遍历代码:
// 替换原来的foreach循环 foreach(DataRow row in dt.Rows) { // 获取当前行的时间(CSV第一列) string time = row[0].ToString(); // 遍历除时间列外的所有数据列 for(int i = 1; i < dt.Columns.Count; i++) { DataColumn col = dt.Columns[i]; // 尝试将列值转为double类型(如果是整数可改用int.TryParse) if(double.TryParse(row[i].ToString(), out double value)) { graphItems.Add(new { datalabel = col.ColumnName, time = time, value = value }); } } } // 最后将列表序列化为JSON返回 return Json(graphItems, JsonRequestBehavior.AllowGet);
额外优化建议
- 可以提前判断CSV列数是否≥2(时间列+至少一个数据列),避免空数据场景;
- 如果CSV数值格式不规范,可增加异常处理逻辑;
- 若使用.NET Core/.NET 5+,可去掉
JsonRequestBehavior.AllowGet,直接写return Json(graphItems);。
内容的提问来源于stack exchange,提问作者Eli
相关产品推荐
相关产品推荐

