14

当我将 WCF 配置为使用 JSON 序列化并在我的一个 DataContracts 中包含一个 DataTable 时,它​​会先将 DataTable 序列化为 XML,然后再将整个 DataContract 序列化为 JSON。我希望将 DataTable 序列化为 JSON,而不是 XML。

我的问题是:

  1. 为什么先将DataTable序列化为XML?
  2. 我怎样才能让它序列化为 JSON?
4

4 回答 4

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

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

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

于 2013-07-29T18:06:02.557 回答
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);
}
于 2015-03-07T11:04:32.003 回答
4

我有同样的问题,我的 wcf 服务在将它从 Dataset 转换为 Json 时没有正确格式化 json。我通过使用以下解决方案使其工作:

using System.ServiceModel.Channels;
using System.ServiceModel.Web;

dsData 是我的数据集

string json = Newtonsoft.Json.JsonConvert.SerializeObject(dsData);
return WebOperationContext.Current.CreateTextResponse(json, "application/json;charset=utf-8", System.Text.Encoding.UTF8);

和“消息”将是返回类型。

于 2015-12-24T04:09:37.980 回答
2

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

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

请注意,Rich Strahl有一篇很棒的帖子,其中包含更多详细信息,并且为了比较,他还包括了一些他JavaScriptSerializer与(相当广泛的)自定义转换器一起使用的自定义工作。

于 2013-07-29T16:12:11.310 回答