cSON中的JSON字符串到CSV和CSV到JSON的转换

我正在使用我的asp.net web API项目中的JSON / CSV文件,并尝试使用CSVHelper和ServiceStack.Text库但无法使其工作。

包含数组的JSON文件是动态的,可能包含任意数量的字段

我使用streamreader读取文件,然后需要将其转换为CSV文件,以便最终用户下载。

示例文件文本

[{"COLUMN1":"a","COLUMN2":"b","COLUMN3":"c","COLUMN4":"d","COLUMN5":"e"}, {"COLUMN1":"a","COLUMN2":"b","COLUMN3":"c","COLUMN4":"d","COLUMN5":"e"}] 

JSON到CSV

 public static string jsonStringToCSV(string content) { var jsonContent = (JArray)JsonConvert.DeserializeObject(content); var csv = ServiceStack.Text.CsvSerializer.SerializeToCsv(jsonContent); return csv; } 

这不会导致我的CSV数据

在此处输入图像描述

然后一些文件是带有逗号或制表符的分隔符类型,我想利用CSVHelper将CSV字符串动态转换为IEnumerable

 public static IEnumerable StringToList(string data, string delimiter, bool HasHeader) { using (var csv = new CsvReader(new StringReader(data))) { csv.Configuration.SkipEmptyRecords = true; csv.Configuration.HasHeaderRecord = HasHeader; csv.Configuration.Delimiter = delimiter; var records = csv.GetRecords(); return records; } } 

我能够通过DeserializeObject将它解决为使用Json.net的数据表,所以想要发布我自己的答案但不会将其标记为已接受,如果有人有更好的方法来做到这一点。

将JSON字符串转换为DataTable

 public static DataTable jsonStringToTable(string jsonContent) { DataTable dt = JsonConvert.DeserializeObject(jsonContent); return dt; } 

制作CSV字符串

 public static string jsonToCSV(string jsonContent, string delimiter) { StringWriter csvString = new StringWriter(); using (var csv = new CsvWriter(csvString)) { csv.Configuration.SkipEmptyRecords = true; csv.Configuration.WillThrowOnMissingField = false; csv.Configuration.Delimiter = delimiter; using (var dt = jsonStringToTable(jsonContent)) { foreach (DataColumn column in dt.Columns) { csv.WriteField(column.ColumnName); } csv.NextRecord(); foreach (DataRow row in dt.Rows) { for (var i = 0; i < dt.Columns.Count; i++) { csv.WriteField(row[i]); } csv.NextRecord(); } } } return csvString.ToString(); } 

Web API中的最终用法

 string csv = jsonToCSV(content, ","); HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK); result.Content = new StringContent(csv); result.Content.Headers.ContentType = new MediaTypeHeaderValue("text/csv"); result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") { FileName = "export.csv" }; return result; 

我不知道为你的问题报告解决方案是否为时已晚。 如果你想探索开源库来完成这项工作,以下是其中之一

Cinchoo ETL使用几行代码轻松地将JSON转换为csv

 using (var r = new ChoJSONReader("sample.json")) { using (var w = new ChoCSVWriter("sample.csv").WithFirstLineHeader()) { w.Write(r); } } 

有关更多信息/来源,请访问https://github.com/Cinchoo/ChoETL

Nuget包: Install-Package ChoETL.JSON

完全披露:我是这个图书馆的作者。

 public void Convert2Json() { try { if (FileUpload1.PostedFile.FileName != string.Empty) { string[] FileExt = FileUpload1.FileName.Split('.'); string FileEx = FileExt[FileExt.Length - 1]; if (FileEx.ToLower() == "csv") { string SourcePath = Server.MapPath("Resources//" + FileUpload1.FileName); FileUpload1.SaveAs(SourcePath); string Destpath = (Server.MapPath("Resources//" + FileExt[0] + ".json")); StreamWriter sw = new StreamWriter(Destpath); var csv = new List(); var lines = System.IO.File.ReadAllLines(SourcePath); foreach (string line in lines) csv.Add(line.Split(',')); string json = new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(csv); sw.Write(json); sw.Close(); TextBox1.Text = Destpath; MessageBox.Show("File is converted to json."); } else { MessageBox.Show("Invalid File"); } } else { MessageBox.Show("File Not Found."); } } catch (Exception ex) { MessageBox.Show(ex.Message); } }