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

Pri*_*hee 11 c# csv json csvhelper

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

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

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

示例文件文本

[{"COLUMN1":"a","COLUMN2":"b","COLUMN3":"c","COLUMN4":"d","COLUMN5":"e"},
 {"COLUMN1":"a","COLUMN2":"b","COLUMN3":"c","COLUMN4":"d","COLUMN5":"e"}]
Run Code Online (Sandbox Code Playgroud)

JSON到CSV

public static string jsonStringToCSV(string content)
{
    var jsonContent = (JArray)JsonConvert.DeserializeObject(content);

    var csv = ServiceStack.Text.CsvSerializer.SerializeToCsv(jsonContent);
    return csv;
}
Run Code Online (Sandbox Code Playgroud)

这不会导致我的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;
     }
}
Run Code Online (Sandbox Code Playgroud)

Pri*_*hee 35

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

将JSON字符串转换为DataTable

public static DataTable jsonStringToTable(string jsonContent)
        {
            DataTable dt = JsonConvert.DeserializeObject<DataTable>(jsonContent);
            return dt;
        }
Run Code Online (Sandbox Code Playgroud)

制作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();
        }
Run Code Online (Sandbox Code Playgroud)

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;
Run Code Online (Sandbox Code Playgroud)

  • CsvWriter 在另一个名为 CsvHelper 的包中可用 - https://github.com/JoshClose/CsvHelper 你可以安装 &gt; Install-Package CsvHelper (4认同)

Raj*_*ajN 16

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

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

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

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

Nuget套餐:

.NET Framework:

      Install-Package ChoETL.JSON
Run Code Online (Sandbox Code Playgroud)

.NET核心:

      Install-Package ChoETL.JSON.NETStandard
Run Code Online (Sandbox Code Playgroud)

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

  • 了解.仅供参考,它是一个开源库,展示了如何使用它来解决问题.没有比这更好的了. (13认同)
  • 这个图书馆太棒了。它甚至可以将嵌套的 json 级别分解为 csv,捕获所有数据。 (2认同)

Slo*_*vic 5

最近遇到了同样的问题,我相信使用System.Dynamic.ExpandoObjectCsvHelper有一个更优雅的解决方案。它的代码更少,希望性能与 DataTable 相似或更好。

    public static string JsonToCsv(string jsonContent, string delimiter)
    {
        var expandos = JsonConvert.DeserializeObject<ExpandoObject[]>(jsonContent);

        using (var writer = new StringWriter())
        {
            using (var csv = new CsvWriter(writer))
            {
                csv.Configuration.Delimiter = delimiter;

                csv.WriteRecords(expandos as IEnumerable<dynamic>);
            }

            return writer.ToString();
        }
    }
Run Code Online (Sandbox Code Playgroud)