El otro día me enfrenté al problema de crear un fichero CSV a partir de un objeto JSON en ASP.NET. En este artículo os mostraré cómo convertir un JSON en CSV con XML y Dataset. Para ello utilizaremos un método de DataTable para crear el CSV, XMLNodeReader para crear el XML desde un nodo XML y JSON. DesearializeXmlNode. ¡Comencemos a trabajar!
var json={ "employees": [ { "firstName":"John" , "lastName":"Doe" }, { "firstName":"Anna" , "lastName":"Smith" }, { "firstName":"Peter" , "lastName":"Jones" } ] }
Primero necesitamos deserializar esto:
XmlNode xml = JSON.DeserializeXmlNode("{records:{record:" + json + "}}");
XmlDocument xmldoc = new XmlDocument(); //Create XmlDoc Object xmldoc.LoadXml(xml.InnerXml); //Create XML Steam var xmlReader = new XmlNodeReader(xmldoc); DataSet dataSet = new DataSet(); //Load Dataset with Xml dataSet.ReadXml(xmlReader); //return single table inside of dataset var csv = dataSet.Tables[0].ToCSV(",");
Te habrás dado cuenta que aquí está el método .ToCSV. Vamos a ver cómo crear esto.
public static string ToCSV(this DataTable table,string delimator) { 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' }); //return result.ToString(); }
Eso es.
Aquí, veremos cómo convertir un string a OnjectList, Object que a s u vez será un string de Json.
Utilizando la clase JavascriptSerializer de C#
public static class Helper { public static string AsJsonList<T>(List<T> tt) { return new JavaScriptSerializer().Serialize(tt); } public static string AsJson<T>(T t) { return new JavaScriptSerializer().Serialize(t); } public static List<T> AsObjectList<T>(string tt) { return new JavaScriptSerializer().Deserialize<List<T>>(tt); } public static T AsObject<T>(string t) { return new JavaScriptSerializer().Deserialize<T>(t); } }
Esto te ayudará a crear el JSON a partir del datatable.
public string DataTableToJsonObj(DataTable dt) { DataSet ds = new DataSet(); ds.Merge(dt); StringBuilder JsonString = new StringBuilder(); if (ds != null && ds.Tables[0].Rows.Count > 0) { JsonString.Append("["); for (int i = 0; i < ds.Tables[0].Rows.Count; i++) { JsonString.Append("{"); for (int j = 0; j < ds.Tables[0].Columns.Count; j++) { if (j < ds.Tables[0].Columns.Count - 1) { JsonString.Append(""" + ds.Tables[0].Columns[j].ColumnName.ToString() + "":" + """ + ds.Tables[0].Rows[i][j].ToString() + "","); } else if (j == ds.Tables[0].Columns.Count - 1) { JsonString.Append(""" + ds.Tables[0].Columns[j].ColumnName.ToString() + "":" + """ + ds.Tables[0].Rows[i][j].ToString() + """); } } if (i == ds.Tables[0].Rows.Count - 1) { JsonString.Append("}"); } else { JsonString.Append("},"); } } JsonString.Append("]"); return JsonString.ToString(); } else { return null; }
Para crear el CSV, utilizaremos el paquete Nuget.
Install-Package ServiceStack.Text
Cómo utilizarlo
JSON
string JsonSerializer.SerializeToString<T>(T value) void JsonSerializer.SerializeToWriter<T>(T value, TextWriter writer) T JsonSerializer.DeserializeFromString<T>(string value) T JsonSerializer.DeserializeFromReader<T>(TextReader reader)
JSV
string TypeSerializer.SerializeToString<T>(T value) void TypeSerializer.SerializeToWriter<T>(T value, TextWriter writer) T TypeSerializer.DeserializeFromString<T>(string value) T TypeSerializer.DeserializeFromReader<T>(TextReader reader)
CSV
string CsvSerializer.SerializeToString<T>(T value) void CsvSerializer.SerializeToWriter<T>(T value, TextWriter writer) T CsvSerializer.DeserializeFromString<T>(string value) T CsvSerializer.DeserializeFromReader<T>(TextReader reader)
Fuente: Yaseer Arafat