2009-09-19 6 views
5

JavaScriptSerializer türetilen seri hale türleri JavaScript diziler IEnumerable'dan edilen türde serializes. Bu diziler ve listeler için ama türetilmiş tip (IGrouping örn Anahtarı) bildirilen özellikleri serialize gerekiyor bazı durumlarda kullanışlı. İşte bazı örnek kod:JSON: IEnumerable'dan

var items = new[] { "aaabbb", "abcd", "bdsasd", "bsdqw" }; 
IGrouping<char, string> data = items.GroupBy(i => i[0]).First(); 
var serializer = new JavaScriptSerializer(); 
var serialized = serializer.Serialize(data); 
// serialized == "[\"aaabbb\",\"abcd\"]" 
// doesn't contain definition for IGrouping.Key property 

Bu sorun için basit bir çözüm var mı?

var items = new[] { "aaabbb", "abcd", "bdsasd", "bsdqw" }; 
var data = (from x in items 
      group x by x[0] into g 
      select new 
      { 
       Key = g.Key, 
       Value = g 
      }).First(); 
var serializer = new JavaScriptSerializer(); 
var serialized = serializer.Serialize(data); 

ya da isterseniz:

cevap

3

Bunu denemek için, her iki durumda da

var items = new[] { "aaabbb", "abcd", "bdsasd", "bsdqw" }; 
var data = items.GroupBy(i => i[0]) 
    .Select(x => new { Key = x.Key, Value = x }) 
    .First(); 
var serializer = new JavaScriptSerializer(); 
var serialized = serializer.Serialize(data); 

sonuç şöyle olacaktır:

{"Key":"a","Value":["aaabbb","abcd"]} 
+0

Ben senin fikrim var ama IEnumerable'dan türetilmiş her türlü desteği ile ortak bir çözüm arıyorum: hatta ıcollection, IGrouping, ILookup ve özel kullanıcı tipleri – altso

2

kontrol dışarı JSON.NET. Bunu birkaç projede kullandım ve JSON serileştirme ve serileştirmeyi çok daha kolay hale getirdi. Tek bir yöntem çağrısı ile en nesneleri seri ve ayrıca özel nitelikleri ile serileştirme üzerinde daha ince taneli kontrol sahibi olma olanağı olacaktır. İşte

yazarın web sitesinden bir örnek var:

Product product = new Product(); 

product.Name = "Apple"; 

product.Expiry = new DateTime(2008, 12, 28); 

product.Price = 3.99M; 

product.Sizes = new string[] { "Small", "Medium", "Large" }; 

string json = JsonConvert.SerializeObject(product); 

//{ 

// "Name": "Apple", 

// "Expiry": new Date(1230422400000), 

// "Price": 3.99, 

// "Sizes": [ 

// "Small", 

// "Medium", 

// "Large" 

// ] 

//} 



Product deserializedProduct = JsonConvert.DeserializeObject<Product>(json); 
+3

Cool! Şimdi "ürünler" bir IEnumerable hakkında ne? O .. hataları ile yere düşer – Aaron

+0

Aynı sorun yaşıyorum. IEnumerable uygulayan bazı özel türlerin mutlaka destek koleksiyonlarına sahip olmaları gerekmez. Dinamik olarak üretilebilirler, örneğin 'verim' veya LINQ kullanarak. Bu durumda, varsayılan dizidir seri atlamak ve sadece sınıfın kalan üyelerini depolamak istiyor. –

+0

burada sorumu Sorular: http://stackoverflow.com/questions/15034912/how-do-i-skip-default-javascript-array-serialization-for-ienumerable-types-in-js –