Crear un CSV a partir de un JSON en C#

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

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP