Te sugerimos que revises esta resolución en un ambiente controlado antes de pasarlo a producción, saludos.
Solución:
Pude resolverlo deserializeObject en una tabla de datos usando Json.net, así que quiero publicar mi propia respuesta pero no la marcaré como aceptada, si alguien tiene una mejor manera de hacerlo.
Para convertir JSON string a tabla de datos
public static DataTable jsonStringToTable(string jsonContent)
DataTable dt = JsonConvert.DeserializeObject(jsonContent);
return dt;
Para hacer CSV string
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 final en 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;
No sé si es demasiado tarde para informar la solución a su pregunta. En caso de que desee explorar la biblioteca de código abierto para hacer el trabajo, aquí hay una
Cinchoo ETL facilita la conversión de JSON a csv con pocas líneas de código
using (var r = new ChoJSONReader("sample.json"))
using (var w = new ChoCSVWriter("sample.csv").WithFirstLineHeader())
w.Write(r);
Para obtener más información/fuente, vaya a https://github.com/Cinchoo/ChoETL
Paquete Nuget:
.NET Framework:
Install-Package ChoETL.JSON
Núcleo de .NET:
Install-Package ChoETL.JSON.NETStandard
Divulgación completa: soy el autor de esta biblioteca.
Tuve el mismo problema recientemente y creo que hay una solución un poco más elegante usando System.Dynamic.ExpandoObject y CsvHelper. Es menos código y, con suerte, el rendimiento es similar o mejor en comparación con DataTable.
public static string JsonToCsv(string jsonContent, string delimiter)
var expandos = JsonConvert.DeserializeObject(jsonContent);
using (var writer = new StringWriter())
using (var csv = new CsvWriter(writer))
csv.Configuration.Delimiter = delimiter;
csv.WriteRecords(expandos as IEnumerable);
return writer.ToString();
No se te olvide dar visibilidad a esta noticia si lograste el éxito.