2013-02-22 24 views
7

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. Dưới đây là một ví dụ:Làm cách nào để bỏ qua chuỗi tuần tự hóa JavaScript mặc định cho các loại IEnumerable trong Json.Net?

public class SOJsonExample 
{ 
    public class MyCustomEnumerable : IEnumerable<KeyValuePair<int,float>> 
    { 
     public List<int> Keys { get; set; } 
     public List<float> Values { get; set; } 

     public MyCustomEnumerable() 
     { 
      Keys = new List<int> { 1, 2, 3 }; 
      Values = new List<float> { 0.1f, 0.2f, 0.3f }; 
     } 

     public IEnumerator<KeyValuePair<int, float>> GetEnumerator() 
     { 
      var kvps = 
       from key in Keys 
       from value in Values 
       select new KeyValuePair<int, float>(key, value); 

      return kvps.GetEnumerator(); 
     } 

     IEnumerator IEnumerable.GetEnumerator() 
     { 
      return this.GetEnumerator(); 
     } 
    } 
} 

Tôi đã phát hiện ra rằng serialization mặc định bằng cách Json.NET là để liệt kê mỗi giá trị và lưu trữ các giá trị trong một mảng JavaScript (mà tôi không muốn). Trình deserializer mặc định sẽ không deserialize bộ sưu tập vì nó không thể được điền. Trong những trường hợp này, thay vào đó, tôi muốn Json.NET bỏ qua chuỗi tuần tự hóa JavaScript mặc định và chỉ lưu trữ các thành viên của lớp đó.

Tất cả những gì tôi muốn là khóa và giá trị của mình - có cách tắt nào để thực hiện việc này hay tôi phải triển khai trình tự sắp xếp tùy chỉnh của riêng mình không?

Đã kiểm tra thisthis, không phải chính xác câu hỏi của tôi. Quét the documentation là tốt, nhưng không tìm thấy những gì tôi đang tìm kiếm (có lẽ tôi đã tìm nhầm chỗ).

(Chỉnh sửa # 1 - cải thiện rõ nét)

(Chỉnh sửa # 2 - đã trả lời câu hỏi của riêng tôi ... xem dưới đây)

Trả lời

12

trả lời câu hỏi của riêng tôi - xem tuyệt vời documentation on IEnumerable, Lists, and Arrays:

Các danh sách .NET (các kiểu kế thừa từ IEnumerable) và các mảng .NET được chuyển thành các mảng JSON. Vì các mảng JSON chỉ hỗ trợ một loạt các giá trị và không phải là các thuộc tính, nên bất kỳ thuộc tính và trường bổ sung nào được khai báo trên các bộ sưu tập .NET đều không được tuần tự hóa. Trong các tình huống mà một mảng JSON không muốn JsonObjectAttribute có thể được đặt trên một kiểu .NET thực hiện IEnumerable để buộc loại được tuần tự hóa như một đối tượng JSON thay thế.

Vì vậy, ví dụ của tôi:

[JsonObject] 
public class MyCustomEnumerable : IEnumerable<KeyValuePair<int,float>> 
{ 
    ... 
} 
+0

Trang này có giới thiệu cho 'JsonObject' và các thuộc tính khác. http://www.newtonsoft.com/json/help/html/SerializationAttributes.htm – kmc059000

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