JSON: Сериализация типов, производных от IEnumerable - PullRequest
5 голосов
/ 19 сентября 2009

JavaScriptSerializer сериализует типы, полученные из IEnumerable как массивы JavaScript. Это удобно для массивов и списков, но в некоторых случаях мне нужно сериализовать свойства, объявленные в производном типе (например, Key in IGrouping). Вот пример кода:

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

Есть ли простое решение этой проблемы?

Ответы [ 2 ]

3 голосов
/ 19 сентября 2009

Вы можете попробовать это:

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"]}
2 голосов
/ 20 сентября 2009

Выезд 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...