當我將WCF配置爲使用jSON序列化並在我的DataContracts中包含DataTable時,它在將整個DataContract序列化爲jSON之前將DataTable序列化爲XML。我想要將DataTable序列化爲jSON,而不是XML。什麼是json在WCF中序列化.NET DataTable的最佳方式?
我的問題是:
- 爲什麼它第一序列的數據表到XML?
- 我怎樣才能讓它序列化爲jSON呢?
當我將WCF配置爲使用jSON序列化並在我的DataContracts中包含DataTable時,它在將整個DataContract序列化爲jSON之前將DataTable序列化爲XML。我想要將DataTable序列化爲jSON,而不是XML。什麼是json在WCF中序列化.NET DataTable的最佳方式?
我的問題是:
DataTable是一個純粹的.NET構造,它不能(容易地)以JSON的無損方式表示。 DataTables包含很多JSON無法存儲的附加信息:主鍵autoinc允許空值,標題,數據類型,索引等。序列化爲XML/Binary是DataTable本身可以由.NET本地化序列化的唯一方法。這個XML序列化的DataTable被序列化爲JSON。
使用JSON.NET或FastJSON到DataTable轉換爲平原,數據表,它可以通過任何JSON的客戶,而不只是.NET WCF客戶端使用的清潔JSON兼容的版本。您將失去上面(1)中提到的所有DataTable自定義屬性,只獲取字段名稱/值JSON對。由於每行中的字段名稱重複,以這種方式存儲效率不高。
請勿在DataContract中使用DataTable。如果您想要DataTable的好處,並且您的客戶端始終是.NET,請通過Binary Serialization將DataTable序列化爲一個字節數組,然後可以選擇壓縮生成的序列化字節流。在DataContract中公開一個字節數組。這將使您在客戶端(在解壓縮和二進制反序列化之後)獲得DataTable的高效完全無損版本,而不是DataTable的淡化JSON版本(由(2)提供)...
根據其主頁上的圖表,Json.NET確實是您唯一的選擇 - 您可以快速從NuGet中獲得。幸運的是,這是一個很棒的圖書館,使用起來非常簡單。
string json = JsonConvert.SerializeObject(myDataSet, new DataSetConverter());
注意Rich Strahl有一個偉大的職位有更多的細節,他也包括他對使用JavaScriptSerializer
與比較的緣故(相當廣泛)定製的轉換一些自定義的工作。
這很奏效,但後來我很快意識到數據列/字段名被包括在每一行中,使得它非常低效,正如Keith所說。我將嘗試修改DataTableConverter和DataRowConverter,以便我不重複所有這些列/字段名稱。 – rhyno
@rhyno什麼是你最終的解決方案,不重複所有的列/字段名稱?我知道我要做什麼,但是如果你已經做到了這一點,它會爲我節省一些時間。 – DeadlyChambers
試試這個:
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);
}
我有同樣的問題,我的WCF服務沒有格式化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);
和「消息」將返回類型。
歡迎來到S.O.爲了序列化爲json,你嘗試了什麼? –
考慮到這一點,並將您的數據錶轉換爲JSON http:// stackoverflow。com/questions/17398019/how-to-convert-datatable-to-json-in-c-sharp –