在WCF中jSON序列化.NET DataTable的最佳方法是什么?

rhy*_*yno 14 .net wcf serialization json json.net

当我将WCF配置为使用jSON序列化并在我的一个DataContracts中包含DataTable时,它会在将整个DataContract序列化为jSON之前将DataTable序列化为XML.我希望将DataTable序列化为jSON,而不是XML.

我的问题是:

  1. 为什么它首先将DataTable序列化为XML?
  2. 如何让它序列化为jSON呢?

Kei*_*ows 13

  1. DataTable是纯.NET构造,不能由JSON以无损方式(轻松)表示.DataTables包含许多JSON无法存储的附加信息:主键,autoincs,允许空值,标题,数据类型,索引等.序列化为XML/Binary是.NET本机序列化DataTable的唯一方法.然后将此XML序列化DataTable序列化为JSON.

  2. 使用JSON.NETFastJSON将DataTable转换为简单,干净的JSON兼容版本的DataTable,可以由任何JSON客户端使用,而不仅仅是.NET WCF客户端.您将丢失上面(1)中提到的所有DataTable自定义属性,并且只获取字段名称/值JSON对.由于每行中的字段名称重复,以这种方式存储是低效的.

不要在DataContract中使用DataTable.如果您希望获得DataTable的好处并且您的客户端始终是.NET,则通过二进制序列化将DataTable序列化为字节数组,然后可选地压缩生成的序列化字节流.在DataContract中显示一个字节数组.这将在客户端为您提供高效,完全无损的DataTable版本(在解压缩和二进制反序列化之后),而不是DataTable的淡化JSON版本(由(2)提供)...


MUH*_* PA 6

试试这个:

public string ConvertDataTabletoString(System.Data.DataTable dt)
{
    System.Web.Script.Serialization.JavaScriptSerializer serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
    List<Dictionary<string, object>> rows = new List<Dictionary<string, object>>();
    Dictionary<string, object> row;
    foreach (System.Data.DataRow dr in dt.Rows)
    {
        row = new Dictionary<string, object>();
        foreach (System.Data.DataColumn col in dt.Columns)
        {
            row.Add(col.ColumnName, dr[col]);
        }
        rows.Add(row);
    }
    return serializer.Serialize(rows);
}
Run Code Online (Sandbox Code Playgroud)