2009-09-19 14 views
5

JavaScript Serializer serializza i tipi derivati ​​da IEnumerable come array JavaScript. È comodo per array e liste ma in alcuni casi ho bisogno di serializzare le proprietà dichiarate nel tipo derivato (ad esempio, Key in IGrouping). Ecco alcuni esempi di codice:JSON: serializzazione dei tipi derivati ​​da 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 

Esiste una soluzione semplice per questo problema?

risposta

3

Si potrebbe provare questo:

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

o se si preferisce:

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

In entrambi i casi il risultato sarebbe:

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

Ho la tua idea, ma sono alla ricerca di una soluzione comune con il supporto di tutti i tipi derivati ​​da IEnumerable: ICollection, IGrouping, iLookup e anche tipi di utenti personalizzati – altso

2

Partenza JSON.NET. L'ho usato su un paio di progetti e rende la serializzazione e la deserializzazione JSON molto più semplici. Serializzerà la maggior parte degli oggetti con una singola chiamata di metodo e inoltre ti permetterà di avere un controllo più fine sulla serializzazione con attributi personalizzati.

Ecco un esempio dal sito dell'autore:

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! Ora che ne dite di un IEnumerable di "prodotti"? Cade sopra con errori .. – Aaron

+0

Sto avendo lo stesso problema. Alcuni tipi personalizzati che implementano IEnumerable non hanno necessariamente raccolte di backup. Potrebbero essere generati dinamicamente, ad esempio usando "yield" o LINQ. In tal caso, voglio saltare la serializzazione predefinita degli array JavaScript, e solo memorizzare i restanti membri della classe. –

+0

Ho posto la mia domanda qui: http://stackoverflow.com/questions/15034912/how-do-i-skip-default-javascript-array-serialization-for-ienumerable-types-in-js –

Problemi correlati