c#中JSON字符串到CSV和CSV到JSON的转换

Posted

技术标签:

【中文标题】c#中JSON字符串到CSV和CSV到JSON的转换【英文标题】:JSON string to CSV and CSV to JSON conversion in c# 【发布时间】:2021-12-27 16:56:19 【问题描述】:

我在我的 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;
     

【问题讨论】:

您能否向我们提供给出的错误或输出 @Eminem 请看excel截图。 我要求它提供的输出。不是你期望它给的 是的,相同,屏幕截图与我预期的不同。 我的坏。我认为这些是实际值 【参考方案1】:

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

将 JSON 字符串转换为 DataTable

public static DataTable jsonStringToTable(string jsonContent)
        
            DataTable dt = JsonConvert.DeserializeObject<DataTable>(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;

【讨论】:

正是我想要完成的。效果很好! 效果好吗?由于 newtonsoft 中的格式化,我的 jsonStringToTable 崩溃了。 当我在 NuGet 库中搜索 Json.NET 时,我会在结果窗口中返回 Newtonsoft.Json。我想是一样的。它已经安装在我的项目中,但 CsvWriter 似乎丢失了。该项目正在使用 .NET v4.6.2 任何想法如何让它工作? CsvWriter 在另一个名为 CsvHelper 的包中可用 - github.com/JoshClose/CsvHelper 你可以安装 > Install-Package CsvHelper 当你有一个 Json 对象作为字段时你会怎么做?反序列化为DataTable会报错【参考方案2】:

我不知道现在报告您的问题的解决方案是否为时已晚。以防万一你想探索开源库来完成这项工作,这里有一个

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 包:

.NET 框架:

      Install-Package ChoETL.JSON

.NET 核心:

      Install-Package ChoETL.JSON.NETStandard

小提琴样例:https://dotnetfiddle.net/T3u4W2

完全披露:我是这个库的作者。

【讨论】:

明白了。仅供参考,它是一个开源库,展示了如何使用它来解决问题。仅此而已。 我明白了。我只是说社区是如何看待它的。只需包括您与图书馆的关系就可以了。 我安装了你的Install-Package ChoETL,然后尝试添加它的命名空间。但是系统给了我 reference missing 的错误。我也清洗了溶液,但都是徒劳的。你能帮忙吗!! @RajN 你的项目是.net framework还是.net core?如果 .net 核心使用 ChoETL.JSON.NETStandard 包。如果是 .net 框架,请使用 ChoETL.JSON 这个库很棒。它甚至可以将嵌套级别的 json 分解为 csv,捕获所有数据。【参考方案3】:

最近遇到了同样的问题,我相信使用System.Dynamic.ExpandoObject 和CsvHelper 会有更优雅的解决方案。它的代码更少,希望性能与 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();
        
    

【讨论】:

我发现这个解决方案是最好的。 :-) 如果某些条目缺少某些值,则无法使其正常工作【参考方案4】:

这段代码对我来说没问题:

3 个函数(检查、解析和辅助)

    private bool IsValidJson(string strInput)
    
        try 
         
            if (string.IsNullOrWhiteSpace(strInput))  return false; 
        
            strInput = strInput.Trim();

            if ((strInput.StartsWith("") && strInput.EndsWith("")) || (strInput.StartsWith("[") && strInput.EndsWith("]"))) 
            
                try
                
                    _ = JToken.Parse(strInput);

                    return true;
                
                catch
                
                    return false;
                
            

            return false;
        
        catch  throw; 
    

    private string ParseJsonToCsv(string json)
    
        try
        
            XmlNode xml = JsonConvert.DeserializeXmlNode("records:record:" + json + "");

            XmlDocument xmldoc = new XmlDocument(); xmldoc.LoadXml(xml.InnerXml);

            DataSet dataSet = new DataSet(); dataSet.ReadXml(new XmlNodeReader(xmldoc));

            string csv = DTableToCsv(dataSet.Tables[0], ",");

            return csv;
        
        catch  throw; 
    

    private string DTableToCsv(DataTable table, string delimator)
    
        try 
         
            var result = new StringBuilder();

            for (int i = 0; i < table.Columns.Count; i++)
            
                result.Append(table.Columns[i].ColumnName);
                result.Append(i == table.Columns.Count - 1 ? "\n" : delimator);
            

            foreach (DataRow row in table.Rows)
                for (int i = 0; i < table.Columns.Count; i++)
                
                    result.Append(row[i].ToString());
                    result.Append(i == table.Columns.Count - 1 ? "\n" : delimator);
                

            return result.ToString().TrimEnd(new char[]  '\r', '\n' );
        
        catch  throw; 
    

【讨论】:

【参考方案5】:
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<string[]>(); 
                        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); 
             
        

【讨论】:

您正在使用 line.Split(',') 这不是一个好主意。最好使用 csv 阅读器。【参考方案6】:
using System.Globalization;

using (var csv = new CsvWriter(csvString, CultureInfo.CurrentCulture)) 
  ...

【讨论】:

以上是关于c#中JSON字符串到CSV和CSV到JSON的转换的主要内容,如果未能解决你的问题,请参考以下文章

使用 C# 将 csv 文件转换为 json

解析csv文件中的json字符串[重复]

通过从 csv 获取数据在 C# 中创建 json 数组

无法将 .json 文件从 CSV 下载到 JSON 转换并且无法将 JSON 转换为 CSV

使用 json2csv nodejs 的 JSON 到 CSV 文件

将 Json 数据存储到 JSON 文件并保存在 CSV 文件中