2009-09-19 20 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 

この問題の解決方法はありますか?

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

またはあなたが好む場合:あなたはこの試みることができる

答えて

3

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

2

JSON.NETをチェックしてください。私はいくつかのプロジェクトでそれを使用しています.JSONのシリアライゼーションとデシリアライズがずっと簡単になりました。これは、単一のメソッド呼び出しでほとんどのオブジェクトをシリアライズします。また、カスタム属性を使用したシリアライズを細かく制御できます。

はここで作者のWebサイトからのサンプルです:

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

+0

私は同じ問題を抱えている。 IEnumerableを実装するカスタムタイプの中には、必ずしもバッキングコレクションがありません。例えば、 'yield'やLINQを使って動的に生成することができます。その場合は、デフォルトのJavaScript配列のシリアル化をスキップして、クラスの残りのメンバーを保存するだけです。 –

+0

ここに私の質問:http://stackoverflow.com/questions/15034912/how-do-i-skip-default-javascript-array-serialization-for-ienumerable-types-in-js –

関連する問題