2013-02-22 17 views
7

IEnumerable uygulayan bazı özel türlerin mutlaka yedek koleksiyonları bulunmuyor. Dinamik olarak üretilebilirler, örneğin 'verim' veya LINQ kullanarak. Ben Json.NET varsayılan serileştirme her bir değeri numaralandırmak ve bir JavaScript dizide değerleri (İstemediğim olan) depolamak için olduğunu keşfettilerJson.Net'te IEnumerable türleri için varsayılan JavaScript dizisi serileştirmesini nasıl atlarım?

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

: İşte bir örnek. Varsayılan desperizer daha sonra, koleksiyonun düzenlenemediği için serileştirme başarısız olur. Bu durumlarda, Json.NET'in varsayılan JavaScript dizisi serileştirmesini atlamasını ve sadece sınıfın üyelerini saklamasını istiyorum.

Tek istediğim anahtarlarım ve değerlerim - bunu yapmak için herhangi bir kısayol var mı, yoksa kendi özel seri hale getiricimi mi uygulamak zorundayım?

this ve this adreslerinden hangileri tam olarak benim sorum. the documentation da tarandı, ama aradığım şeyi bulamadım (belki de yanlış yere baktım).

(Düzenleme # 1 - Geliştirilmiş netlik)

(# 2 Düzen - Kendi sorumu yanıtladı ... aşağıya bakınız) Kendi sorumu yanıtladı

cevap

12

- bakınız mükemmel documentation on IEnumerable, Lists, and Arrays:

.NET listeleri (IEnumerable öğesinden devralınan türler) ve .NET dizileri JSON dizilerine dönüştürülür. JSON dizileri yalnızca bir dizi değer ve özelliği desteklemediğinden, .NET koleksiyonlarında bildirilen ek özellikler ve alanlar serileştirilmez. Bir JSON dizisinin aranmadığı durumlarda, JsonObjectAttribute, IEnumerable'ı uygulayan bir .NET türüne yerleştirilebilir; bunun yerine türün JSON nesnesi olarak serileştirilmesi zorlanır.

Yani, benim örneğin:

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

Bu sayfa 'JsonObject' ve diğer özellikler için açıklamaları vardır. http://www.newtonsoft.com/json/help/html/SerializationAttributes.htm – kmc059000