web-dev-qa-db-fra.com

Comment convertir datatable en chaîne json en utilisant json.net?

Comment convertir datatable en json en utilisant json.net? Toute suggestion ... J'ai téléchargé les fichiers binaires nécessaires ... Quelle classe devrais-je utiliser pour obtenir la conversion de mon datatable en json?.

public string GetJSONString(DataTable table)
    {
        StringBuilder headStrBuilder = new StringBuilder(table.Columns.Count * 5); //pre-allocate some space, default is 16 bytes
        for (int i = 0; i < table.Columns.Count; i++)
        {
            headStrBuilder.AppendFormat("\"{0}\" : \"{0}{1}¾\",", table.Columns[i].Caption, i);
        }
        headStrBuilder.Remove(headStrBuilder.Length - 1, 1); // trim away last ,

        StringBuilder sb = new StringBuilder(table.Rows.Count * 5); //pre-allocate some space
        sb.Append("{\"");
        sb.Append(table.TableName);
        sb.Append("\" : [");
        for (int i = 0; i < table.Rows.Count; i++)
        {
            string tempStr = headStrBuilder.ToString();
            sb.Append("{");
            for (int j = 0; j < table.Columns.Count; j++)
            {
                table.Rows[i][j] = table.Rows[i][j].ToString().Replace("'", "");
                tempStr = tempStr.Replace(table.Columns[j] + j.ToString() + "¾", table.Rows[i][j].ToString());
            }
            sb.Append(tempStr + "},");
        }
        sb.Remove(sb.Length - 1, 1); // trim last ,
        sb.Append("]}");
        return sb.ToString();
    }

Maintenant, j'ai pensé à utiliser json.net mais je ne sais pas par où commencer ...

27
Chendur Pandian
string json = JsonConvert.SerializeObject(table, Formatting.Indented);

Edit: Vous n'avez pas besoin de mettre en forme, bien sûr, mais cela le rend agréable et lisible.

62
k_b

Peut-être que cela pourrait aider

Version originale

public static class DataTableToJson
{
    public static JArray ToJson(this System.Data.DataTable source)
    {
        JArray result = new JArray();
        JObject row;
        foreach (System.Data.DataRow dr in source.Rows)
        {
            row = new JObject();
            foreach (System.Data.DataColumn col in source.Columns)
            {
                row.Add(col.ColumnName.Trim(), JToken.FromObject(dr[col]));
            }
            result.Add(row);
        }
        return result;
    }
}

Version éditée  

Il y a une étape intermédiaire car j'avais besoin d'un dictionnaire

public static IEnumerable<Dictionary<string, object>> ToDictionary(this DataTable table)
{
    string[] columns = table.Columns.Cast<DataColumn>().Select(c=>c.ColumnName).ToArray();
    IEnumerable<Dictionary<string, object>>  result = table.Rows.Cast<DataRow>()
            .Select(dr => columns.ToDictionary(c => c, c=> dr[c]));
    return result;
}

Vous pouvez ajouter JsonConverter.SerializeObject(result); ou un autre sérialiseur Json pour obtenir la chaîne JSON.

Ceci est similaire à @Hasan Javaid post

7
Madagaga

Vérifie ça. 

    private static string DataTableToJson(DataTable dataTable)
    {
        JavaScriptSerializer serializer = new JavaScriptSerializer();
        var rows = (from DataRow d in dataTable.Rows
            select dataTable.Columns.Cast<DataColumn>().ToDictionary(col => col.ColumnName, col => d[col])).ToList();

        rows.AddRange(from DataRow d in dataTable.Rows
            select dataTable.Columns.Cast<DataColumn>().ToDictionary(col => col.ColumnName, col => d[col]));
        return serializer.Serialize(rows);
    }
0
Hasan Javaid