Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么';在WCF中jSON序列化.NET数据表的最佳方法是什么?_.net_Json_Wcf_Serialization_Json.net - Fatal编程技术网

什么';在WCF中jSON序列化.NET数据表的最佳方法是什么?

什么';在WCF中jSON序列化.NET数据表的最佳方法是什么?,.net,json,wcf,serialization,json.net,.net,Json,Wcf,Serialization,Json.net,当我将WCF配置为使用jSON序列化,并在我的一个DataContract中包含一个DataTable时,它将DataTable序列化为XML,然后将整个DataContract序列化为jSON。我希望DataTable被序列化为jSON,而不是XML 我的问题是: 为什么它首先将数据表序列化为XML 如何将其序列化为jSON 根据其主页上的图表,这确实是你唯一的选择——你可以很快从网站上获得它。幸运的是,这是一个很好的图书馆,非常容易使用 string json = JsonConvert.S

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

我的问题是:

  • 为什么它首先将数据表序列化为XML
  • 如何将其序列化为jSON

  • 根据其主页上的图表,这确实是你唯一的选择——你可以很快从网站上获得它。幸运的是,这是一个很好的图书馆,非常容易使用

    string json = JsonConvert.SerializeObject(myDataSet, new DataSetConverter());
    
    请注意,这篇文章提供了更多详细信息,为了便于比较,他还介绍了他使用
    JavaScriptSerializer
    和(相当广泛的)自定义转换器所做的一些自定义工作

  • DataTable是一个纯.NET构造,不能(轻松地)用JSON无损地表示。DataTables包含许多JSON无法存储的附加信息:主键、自动递增、允许空值、标题、数据类型、索引等。XML/二进制序列化是.NET本机序列化DataTable的唯一方法。然后将该XML序列化数据表序列化为JSON

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

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

    尝试以下方法:

    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);
    }
    
    公共字符串ConvertDataTabletoString(System.Data.DataTable dt)
    {
    System.Web.Script.Serialization.JavaScriptSerializer serializer=新的System.Web.Script.Serialization.JavaScriptSerializer();
    列表行=新列表();
    字典行;
    foreach(System.Data.DataRow dr in dt.Rows)
    {
    行=新字典();
    foreach(System.Data.DataColumn列,在dt.Columns中)
    {
    行添加(列名称,dr[col]);
    }
    行。添加(行);
    }
    返回序列化程序。序列化(行);
    }
    
    我也有同样的问题,我的wcf服务在将json从数据集转换为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);
    

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

    欢迎到S.O。您尝试了如何序列化JSON?考虑这个问题,并将您的DATABATE转换为JSON,但是我很快意识到数据列/字段名称被包含在每一行中,这使得它非常低效,如基思所提到的。我将尝试修改DataTableConverter和DataRowConverter,以便不重复所有这些列/字段名称。@rhyno不重复所有列/字段名称的最终解决方案是什么?我知道我要做什么,但如果你已经做到了,这将节省我一些时间。回答得很好。非常感谢。我的客户不全是.NET,我很快发现了你提到的效率低下的问题。我将尝试修改此方法,以便不必在每一行中都包含列/字段名。我知道这是一个旧线程,但fastjson支持2011年6月之前发布的1.7.7版的datatable序列化/反序列化。xml格式效率低下,每个字段和行都包含了繁琐的标记。@Keith Blows,序列化一系列数据表怎么样?你建议怎么做?我创建它是为了测试Newtonsoft.Json(打算在linqpad中运行)。序列化的工作方式与您希望的一样。这个答案今天真的救了我的命:)我放弃了寻找从db返回DataTable到JSON的简单方法,而不用为每个表/过程显式声明对象。我的错误是我的
    OperationContract
    返回的序列化json仅仅是
    string
    。这样,它就需要使用
    JSON.parse
    客户端。将返回类型更改为
    System.ServiceModel.Channels.Message
    ,并使用
    WebOperationContext.Current.CreateTextResponse(string)
    ,如上所示,效果非常好:)我从来没有想过,您可以使用WCF WS-setting响应来做这样的事情,而不只是返回
    int/string/class/List等