2009-09-19 33 views
5

JavaScriptSerializer serializes các loại có nguồn gốc từ IEnumerable dưới dạng mảng JavaScript. Nó thuận tiện cho mảng và danh sách nhưng trong một số trường hợp, tôi cần phải tuần tự hóa các thuộc tính được khai báo trong kiểu dẫn xuất (ví dụ: Khóa trong IGrouping). Dưới đây là một số mã mẫu:JSON: Sắp xếp các loại có nguồn gốc từ 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 

Có giải pháp đơn giản nào cho vấn đề này không?

Trả lời

3

Bạn có thể thử này:

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

hoặc nếu bạn thích:

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

Trong cả hai trường hợp kết quả sẽ là:

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

Tôi đã có ý tưởng của bạn, nhưng tôi đang tìm kiếm một giải pháp phổ biến với sự hỗ trợ của tất cả các loại có nguồn gốc từ IEnumerable: ICollection, IGrouping, ILookup và thậm chí tùy chỉnh loại người dùng – altso

2

Check-out JSON.NET. Tôi đã sử dụng nó trên một vài dự án và nó làm cho JSON serialization và deserialization dễ dàng hơn nhiều. Nó sẽ tuần tự hóa hầu hết các đối tượng với một cuộc gọi phương thức duy nhất, và cũng cho phép bạn có quyền kiểm soát tốt hơn đối với việc tuần tự hóa với các thuộc tính tùy chỉnh.

Đây là một mẫu từ trang web của tác giả:

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! Bây giờ những gì về một IEnumerable của "sản phẩm"? Nó rơi xuống với các lỗi .. – Aaron

+0

Tôi đang gặp rắc rối tương tự. Một số loại tùy chỉnh triển khai IEnumerable không nhất thiết phải có bộ sưu tập sao lưu. Chúng có thể được tạo động, ví dụ như sử dụng 'yield' hoặc LINQ. Trong trường hợp đó, tôi muốn bỏ qua tuần tự mảng mặc định của JavaScript và chỉ lưu trữ các thành viên còn lại của lớp. –

+0

Đã đặt câu hỏi của tôi tại đây: http://stackoverflow.com/questions/15034912/how-do-i-skip-default-javascript-array-serialization-for-ienumerable-types-in-js –

Các vấn đề liên quan