2013-07-29 31 views
14

當我將WCF配置爲使用jSON序列化並在我的DataContracts中包含DataTable時,它在將整個DataContract序列化爲jSON之前將DataTable序列化爲XML。我想要將DataTable序列化爲jSON,而不是XML。什麼是json在WCF中序列化.NET DataTable的最佳方式?

我的問題是:

  1. 爲什麼它第一序列的數據表到XML?
  2. 我怎樣才能讓它序列化爲jSON呢?
+0

歡迎來到S.O.爲了序列化爲json,你嘗試了什麼? –

+0

考慮到這一點,並將您的數據錶轉換爲JSON http:// stackoverflow。com/questions/17398019/how-to-convert-datatable-to-json-in-c-sharp –

回答

13
  1. DataTable是一個純粹的.NET構造,它不能(容易地)以JSON的無損方式表示。 DataTables包含很多JSON無法存儲的附加信息:主鍵autoinc允許空值,標題,數據類型,索引等。序列化爲XML/Binary是DataTable本身可以由.NET本地化序列化的唯一方法。這個XML序列化的DataTable被序列化爲JSON。

  2. 使用JSON.NETFastJSON到DataTable轉換爲平原,數據表,它可以通過任何JSON的客戶,而不只是.NET WCF客戶端使用的清潔JSON兼容的版本。您將失去上面(1)中提到的所有DataTable自定義屬性,只獲取字段名稱/值JSON對。由於每行中的字段名稱重複,以這種方式存儲效率不高。

請勿在DataContract中使用DataTable。如果您想要DataTable的好處,並且您的客戶端始終是.NET,請通過Binary Serialization將DataTable序列化爲一個字節數組,然後可以選擇壓縮生成的序列化字節流。在DataContract中公開一個字節數組。這將使您在客戶端(在解壓縮和二進制反序列化之後)獲得DataTable的高效完全無損版本,而不是DataTable的淡化JSON版本(由(2)提供)...

+0

偉大的答案。謝謝。我的客戶並不全是.NET,我很快發現你提到的效率低下。我將嘗試修改此方法,以便我不必在每行中包含列/字段名稱。 – rhyno

+0

我知道這是一箇舊線程,但fastjson支持從2011年6月之前發佈的版本1.7.7開始的數據表序列化/反序列化.XML格式不合適,它包含每個字段和行的繁瑣標記。 –

+0

@Keith Blows,如何序列化DataTable列表?你如何建議這樣做? – Xegara

2

根據其主頁上的圖表,Json.NET確實是您唯一的選擇 - 您可以快速從NuGet中獲得。幸運的是,這是一個很棒的圖書館,使用起來非常簡單。

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

注意Rich Strahl有一個偉大的職位有更多的細節,他也包括他對使用JavaScriptSerializer與比較的緣故(相當廣泛)定製的轉換一些自定義的工作。

+1

這很奏效,但後來我很快意識到數據列/字段名被包括在每一行中,使得它非常低效,正如Keith所說。我將嘗試修改DataTableConverter和DataRowConverter,以便我不重複所有這些列/字段名稱。 – rhyno

+0

@rhyno什麼是你最終的解決方案,不重複所有的列/字段名稱?我知道我要做什麼,但是如果你已經做到了這一點,它會爲我節省一些時間。 – DeadlyChambers

5

試試這個:

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); 
} 
1

我有同樣的問題,我的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); 

和「消息」將返回類型。

相關問題