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

时间:2013-07-29 15:50:47

标签: .net json wcf serialization json.net

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

我的问题是:

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

3 个答案:

答案 0 :(得分: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对。由于每行中的字段名称重复,以这种方式存储效率低下。

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

答案 1 :(得分: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);
}

答案 2 :(得分:2)

根据其主页上的图表,Json.NET是您唯一的选择 - 您可以从NuGet快速获取。幸运的是,它是一个很棒的库,非常容易使用。

string json = JsonConvert.SerializeObject(myDataSet, new DataSetConverter());

请注意,Rich Strahl有一篇包含更多详细信息的精彩帖子,并且他还包含了一些自定义工作,他们使用JavaScriptSerializer和(相当广泛的)自定义转换器进行比较。