2013-02-22 54 views
7

IENumerable को लागू करने वाले कुछ कस्टम प्रकारों में बैकिंग संग्रह आवश्यक नहीं हैं। उन्हें गतिशील रूप से उत्पन्न किया जा सकता है, उदाहरण के लिए 'उपज' या LINQ का उपयोग करना।मैं Json.Net में IENumerable प्रकारों के लिए डिफ़ॉल्ट जावास्क्रिप्ट सरणी क्रमबद्धता कैसे छोड़ूं?

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

मैं ने पाया है कि Json.NET द्वारा चूक क्रमबद्धता प्रत्येक मान की गणना और JavaScript शृंखला में मूल्यों (है जो मैं नहीं चाहता) स्टोर करने के लिए है: यहाँ एक उदाहरण है। डिफ़ॉल्ट deserializer तब संग्रह को deserialize करने में विफल हो जाएगा क्योंकि यह पॉप्युलेट नहीं किया जा सकता है। इन मामलों में, मैं इसके बजाय जेसन.NET को डिफ़ॉल्ट जावास्क्रिप्ट सरणी क्रमबद्धता को छोड़ना चाहता हूं, और बस कक्षा के सदस्यों को स्टोर करना चाहता हूं।

मुझे बस मेरी चाबियाँ और मूल्य चाहिए - क्या ऐसा करने का कोई शॉर्टकट तरीका है, या क्या मुझे अपना कस्टम सीरियलाइज़र लागू करना है?

this और this चेक किया गया, इनमें से कोई भी वास्तव में मेरा प्रश्न नहीं है। स्कैन the documentation साथ ही, लेकिन जो भी मैं ढूंढ रहा था उसे नहीं मिला (शायद मैंने गलत जगह पर देखा)।

(संपादित करें # 1 - बेहतर स्पष्टता)

(संपादित करें # 2 - अपने ही सवाल का जवाब दे ... नीचे देखें)

उत्तर

12

मेरे अपने प्रश्न का उत्तर दिया - देख उत्कृष्ट documentation on IEnumerable, Lists, and Arrays:

.NET सूचियां (प्रकार जो IENumerable से प्राप्त होते हैं) और .NET arrays JSON arrays में परिवर्तित हो जाते हैं। चूंकि JSON arrays केवल मानों की एक श्रृंखला का समर्थन करता है और गुण नहीं, .NET संग्रहों पर घोषित कोई अतिरिक्त गुण और फ़ील्ड क्रमबद्ध नहीं हैं। ऐसी परिस्थितियों में जहां एक JSON सरणी नहीं चाहता था, JsonObjectAttribute को .NET प्रकार पर रखा जा सकता है जो कि जेनॉन ऑब्जेक्ट के रूप में क्रमबद्ध करने के लिए प्रकार को मजबूर करने के लिए IENumerable लागू करता है।

तो, मेरे उदाहरण के लिए:

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

यह पृष्ठ 'JsonObject' और अन्य विशेषताओं के कारण वर्णन है। http://www.newtonsoft.com/json/help/html/SerializationAttributes.htm – kmc059000