2016-03-29 17 views
5

Sto lavorando con i file JSON/CSV nel mio progetto API web asp.net e ho provato con le librerie CSVHelper e ServiceStack.Text ma non sono riuscito a farlo funzionare.Conversione da JSON a CSV e CSV a JSON in C#

Il file JSON contenente una matrice è dinamica e può avere un qualsiasi numero di campi

ho letto il file utilizzando StreamReader e quindi bisogno di convertirlo in file CSV per renderlo scaricabile per gli utenti finali.

testo file di esempio

[{"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; 
} 

Questo non mi risulta dati CSV

enter image description here

Poi alcuni file sono di tipo delimitatore con virgola o scheda e e voglio utilizzare CSVHelper per convertire stringa CSV per IEnumerable dinamicamente

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; 
    } 
} 
+0

Potete indicarci l'errore fornito o l'uscita – Eminem

+0

@Eminem Vedere lo screenshot di Excel. –

+0

Sto chiedendo l'output che dà. Non è quello che ti aspetti dare – Eminem

risposta

15

sono stato in grado di risolverlo da DeserializeObject ad un DataTable utilizzando Json.net, così voglio pubblicare la mia risposta ma non la contrassegnerò come accettata, se qualcuno ha un modo migliore per farlo.

Per convertire stringa JSON per DataTable

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

Per rendere stringa 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(); 
     } 

Uso finale in API Web

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; 
+0

Proprio quello che stavo cercando di realizzare. Funziona alla grande! –

+0

Questo dovrebbe essere contrassegnato come la risposta. Funziona alla grande. – jazzBox

0
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); 
      } 
     } 
3

Non so se è troppo tardi per segnalare la soluzione per la tua domanda. Solo nel caso in cui se si desidera esplorare libreria open source per fare il lavoro, ecco uno

Cinchoo ETL rende facile convertire JSON per CSV con poche righe di codice

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

Per ulteriori informazioni/fonte , vai a https://github.com/Cinchoo/ChoETL

Full Disclosure: Sono l'autore di questa libreria.

+0

L'eccessiva promozione di un prodotto/risorsa specifica può essere percepita dalla comunità come ** spam **. Dai uno sguardo alla [guida], specialmente [quale tipo di comportamento è previsto per gli utenti?] (Https://stackoverflow.com/help/behavior) nell'ultima sezione: _evita l'auto-promozione esplicita_. Potresti anche essere interessato a [Come non essere uno spammer] (https://stackoverflow.com/help/promotion) e [Come faccio a fare pubblicità su Stakeoverflow?] (Https://stackoverflow.com/help/advertising) . – Nkosi

+1

capito. Cordiali saluti, È una libreria open source, che mostra come realizzare il problema usandolo. Niente di più. – RajN

+0

Capisco. Sto solo dicendo come viene percepito dalla comunità. Basta includere la tua relazione con la biblioteca e dovrebbe essere Ok. – Nkosi