2013-07-29 25 views
14

jSON serileştirmesi kullanmak için WCF'yi yapılandırdığımda ve DataContract'larımdan birinde bir DataTable'ı eklediğimde, DataContract'ın tamamını jSON'a serileştirmeden önce DataTable'ı XML'e serileştirir. DataTable'ın XML değil jSON olarak serileştirilmesini istiyorum.jSON'un WCF'de bir .NET DataTable serileştirmesinin en iyi yolu nedir?

Sorularım şunlardır:

  1. Neden ilk XML DataTable serialize mu?
  2. Bunun yerine jSON'a serileştirmek için nasıl alabilirim?
+0

S.O. Json'a serileştirmek için ne denedin? –

+0

Bunu göz önünde bulundurun ve veri tabanınızı JSON http: // stackoverflow öğesine dönüştürün.com/questions/17398019/nasıl yapılır-convert-datatable-to-json-in-c-keskin –

cevap

13
  1. DataTable (kolaylıkla) JSON bir kayıpsız bir şekilde temsil olamaz saf .NET oluşumudur. DataTable, JSON'un depolayamayacağı pek çok ek bilgi içerir: Birincil anahtarlar, autoincs, boş değerlere izin, altyazı, veri türü, dizinler, vb. XML/Binary'ye seri hale getirme, DataTable'ın .NET tarafından yerel olarak serileştirilmesinin tek yoludur. Bu XML serileştirilmiş DataTable daha sonra JSON'a serileştirilmiştir.

  2. kullanın JSON.NET veya FastJSON bir ova bir DataTable dönüştürmek için, herhangi bir JSON istemcisi, sadece .NET WCF istemcileri tarafından tüketilebilir DataTable, temiz JSON uyumlu sürümü. Yukarıdaki (1) 'de belirtilen tüm DataTable özel özelliklerini kaybedecek ve sadece alan adı/değeri JSON çiftini alacaksınız. Bu sıradaki depolama, her satırdaki alan adlarının çoğaltılması nedeniyle verimsizdir.

DataContract'ınızda DataTable kullanmayın. Bir DataTable'ın ve istemcilerinizin yararlarının her zaman .NET olmasını istiyorsanız, DataTable'ı İkili Seri Serileştirme yoluyla bir bayt dizisine serileştirin ve daha sonra isteğe bağlı olarak seri hale getirilmiş bayt akışını sıkıştırın. DataContract'ınızda bir bayt dizisi ortaya çıkarın. Bu, DataTable'ın DataTable'ın bir sulandırılmış-aşağı JSON sürümü ((2) tarafından sunulduğu gibi) değil, istemci tarafında DataTable'ın verimli, tamamen kayıpsız bir sürümünü verecektir. (0 (2) tarafından önerildiği gibi) ...

+0

Harika cevaplar. Teşekkür ederim. Müşterilerim .NET değil, ve bahsettiğiniz verimsizlikleri hızlıca keşfettim. Bu yaklaşımı değiştirmeye çalışacağım, böylece her satırda sütun/alan adlarını eklemem gerekmeyecek. – rhyno

+0

Bu eski bir iş parçacığı olduğunu biliyorum, ancak haziran 2011 önce yayımlanan sürüm 1.7.7 sürümünden fastjson desteklenen datatable serileştirme/serileştirme. Ve xml biçimi etkisiz, her alan VE satır için hantal etiket içerir. –

+0

@Keith Blows, bir DataTable Listesi serileştirmeye ne dersiniz? Bunu nasıl yapmanızı önerirsiniz? – Xegara

2

kendi ana sayfasında çizelgeye göre Json.NET gerçekten tek seçenek - hızlı NuGet adresinden elde edebilirsiniz. Neyse ki harika bir kütüphane ve kullanımı çok kolay.

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

Not olduğunu Rich Strahl fazla ayrıntı ile büyük yazı vardır ve o da o karşılaştırma uğruna (oldukça geniş) özel dönüştürücüler ile JavaScriptSerializer kullanmak yaptılar bazı özel çalışmaları içermektedir.

+1

Bu çalıştı, ancak sonra veri sütun/alan adlarının EVERY satırına dahil edildiğini hemen fark ettim, bu onu çok verimsiz hale getirdi Keith'in bahsettiği gibi. DataTableConverter ve DataRowConverter'ı değiştirmeyi deneyeceğim, böylece tüm bu sütun/alan adlarını tekrarlamıyorum. – rhyno

+0

@rhyno Tüm sütun/alan adlarını tekrar etmediğiniz için son çözümünüz neydi? Ne yapacağımı düşündüğümde bir fikrim var ama eğer bunu başardıysan bana biraz zaman kazandıracaktı. – DeadlyChambers

5
bunu deneyin

: Ben aynı sorunu vardı

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

Json için DataSet dönüştürerek ederken, benim wcf hizmeti düzgün json biçimlendirme değildi.

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

dsData döndürme türü olacak benim Veri kümesi

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

ve "Mesaj" dir: Ben aşağıdaki çözümü kullanarak çalışan var.

İlgili konular