繁体   English   中英

CSV 到嵌套的 JSON C#

[英]CSV to Nested JSON C#

我想将一个 csv 文件转换为带有嵌套对象和嵌套数组的 json。 示例 csv 如下所示。 我的 csv 结构可以是动态的,但我可以保持静态以获得下面所需的格式。 我知道类似问题有很多答案,但没有一个解决我的嵌套对象的具体问题。

Id,name,nestedobject/id,nestedarray/0/name
1,name,2,namelist
2,name1,3,namelist1

我想要像下面这样的 json,特别是第 3 列和第 4 列(嵌套对象)有问题

[{"Id": 1,
"name": "name",
"nestedobject": {
"id": 2
},
"nestedarray": [{
"name": "namelist"
}
]
},
{"Id": 2,
"name": "name1",
"nestedobject": {
"id": 3
},
"nestedarray": [
{"name": "namelist1"}]
}
]

请注意保持 csv 文件结构动态我在列名中传递数据类型 - 例如。 “System.Int32:Id”将是我的第一列而不是“Id”。 如何修改我的代码以说明嵌套对象?

public static DataTable ReadCsvFile(string fileName)
        {
            DataTable oDataTable = new DataTable();
            StreamReader oStreamReader = new StreamReader(fileName);
            bool hasColumns = false;

            List<string> ColumnNames = new List<string>();

            string[] oStreamDataValues = null;

            while (!oStreamReader.EndOfStream)
            {
                String oStreamRowData = oStreamReader.ReadLine();
                if(oStreamRowData.Length > 0)
                {
                    oStreamDataValues = oStreamRowData.Split(',');
                    if(!hasColumns)
                    {
                        int i = 0;
                        foreach(string csvcolumn in oStreamRowData.Split(','))
                        {
                            string[] nameWithType = csvcolumn.Split(':');
                            DataColumn oDataColumn = new DataColumn(nameWithType[1], typeof(string));
                            ColumnNames.Add(nameWithType[1]);
                            var type = System.Type.GetType(nameWithType[0]);

                            oDataColumn.DataType = type;
                            oDataTable.Columns.Add(oDataColumn);
                            i = i + 1;
                        }
                        hasColumns = true;
                    }
                    else
                    {
                        DataRow oDataRow = oDataTable.NewRow();
                        for(int i = 0; i < ColumnNames.Count; i++)
                        {

                         oDataRow[ColumnNames[i]] = oStreamDataValues[i] == null ? string.Empty : oStreamDataValues[i].ToString();

                        }
                        oDataTable.Rows.Add(oDataRow);
                    }
                }
            }
            oStreamReader.Close();
            oStreamReader.Dispose();


            return oDataTable;
        }

最后我序列化了DataTable

DataTable dt = ReadCsvFile(filePath);
                dt.CaseSensitive = true;
                var jsonData = JsonConvert.SerializeObject(dt); 

使用Cinchoo ETL ,一个开源库,你可以这样做

string csv = @"Id,name,nestedobject/id,nestedarray/0/name, nestedarray/0/city, nestedarray/1/name, nestedarray/200/city
1,name,2,namelist10, citylist10,namelist11, citylist11
2,name1,3,namelist20, citylist20,namelist21, citylist21";

StringBuilder json = new StringBuilder();
using (var w = new ChoJSONWriter(json))
{
    using (var r = ChoCSVReader.LoadText(csv).WithFirstLineHeader()
        .Configure(c => c.NestedColumnSeparator = '/')
        )
        w.Write(r);
}
Console.WriteLine(json.ToString());

输出

[
 {
  "Id": 1,
  "name": "name",
  "nestedobject": {
    "id": 2
  },
  "nestedarray": [
   {
     "name": "namelist10",
     "city": "citylist10"
   },
   {
     "name": "namelist11"
   }
  ]
 },
 {
  "Id": 2,
  "name": "name1",
  "nestedobject": {
    "id": 3
  },
  "nestedarray": [
   {
     "name": "namelist20",
     "city": "citylist20"
   },
   {
     "name": "namelist21"
   }
  ]
 }
]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM