2009-09-19 55 views
5

JavaScriptSerializer將從IEnumerable派生的類型序列化爲JavaScript數組。它方便陣列和列表,但在某些情況下,我需要序列化在派生類型中聲明的屬性(例如,鍵入IGrouping)。這裏有一些示例代碼:JSON:從IEnumerable派生的序列化類型

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 

有沒有針對這個問題的簡單解決方案?

回答

3

你可以試試這個:

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

或者如果你喜歡:

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

在這兩種情況下,結果將是:

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

我有你的想法,但是我正在尋找與支持自IEnumerable派生的所有類型的通用解決方案:ICollection的,IGrouping,ILookup甚至自定義用戶類型 – altso 2009-09-19 19:32:25

2

退房JSON.NET。我已經在幾個項目中使用了它,它使得JSON序列化和反序列化更容易。它將使用單個方法調用序列化大多數對象,還可以使用自定義屬性對序列化進行更細粒度的控制。

下面是從作者的網站的例子:

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

酷!那麼IEnumerable的「產品」呢?它摔倒了錯誤.. – Aaron 2012-05-17 09:18:12

+0

我有同樣的麻煩。實現IEnumerable的一些自定義類型不一定具有後備集合。它們可以動態生成,例如使用'yield'或LINQ。在這種情況下,我想跳過默認的JavaScript數組序列化,並只存儲該類的其餘成員。 – 2013-02-22 23:00:02

+0

在此處提問我的問題:http://stackoverflow.com/questions/15034912/how-do-i-skip-default-javascript-array-serialization-for-ienumerable-types-in-js – 2013-02-22 23:25:10