2011-12-13 14 views
31

मुझे JArray मिला है जो जेसन सबस्ट्रिंग [1,2,3] का प्रतिनिधित्व करता है। मैं इसे इसके बजाय int[] में बदलना चाहता हूं।प्रकार के एक प्रकार में टाइप प्रकार के JArray को कैसे चालू करना सबसे अच्छा है?

ऐसा करने का सही तरीका क्या है? सबसे अच्छा तरीका है मैं अब तक मिल गया है निम्न करने के लिए है:

int[] items = new int[myJArray.Count]; 

int i = 0; 
foreach (int item in myJArray) 
{ 
    items[i++] = item; 
} 

उत्तर

46
int[] items = myJArray.Select(jv => (int)jv).ToArray(); 
+0

मैं इस विधि को पसंद करता हूं। यह संक्षिप्त और अधिक सुरुचिपूर्ण है। – Mahmoodvcs

+0

मुझे लगता है कि मैं भी यह जवाब पसंद करता हूं। मैं कभी-कभी LINQ को अनदेखा करता हूं। – moswald

+1

कास्टिंग से बचना भी संभव है: myJArray.Select (jv => jv.Value ())। ToArray(); – mikebridge

0
int[] items = new int[myJArray.Count]; 

for (int i=0; i < myJArray.Count;i++) 
{ 
    items[i] = (int)myJArray[i] 
} 

इस fastes समाधान आप कर सकते है। आप सूचकांक द्वारा आइटम तक पहुंचने के रूप में क्लासिक for थोड़ा ForEach की तुलना में तेजी है (दृश्य के पीछे foreach IEnumerator इंटरफ़ेस का उपयोग करता)

या यदि आप पसंद:

JsonArray arr = JsonConvert.Import("[1,2,3,4]"); 
int[] nums = (int[]) arr.ToArray(typeof(int)); 
+0

जबकि मैं जरायरे वर्ग में निर्मित कुछ की उम्मीद कर रहा था, जिसे मैं देख रहा था, कम से कम यह मेरे साथ पुष्टि करता है कि मैंने नहीं किया है। – moswald

2

यह वह जगह है बहुत कमजोर क्योंकि आपको वापस एक स्ट्रिंग में परिवर्तित करना है, लेकिन यदि आप कुछ त्वरित और गंदे कर रहे हैं, जहां प्रदर्शन हिट कोई फर्क नहीं पड़ता है, तो मैं नीचे दी गई विधि का उपयोग करता हूं। मुझे यह पसंद है क्योंकि मुझे जेसन/जॉब्जेक्ट और मेरे पॉको के बीच संपत्तियों को मैप करने के लिए कोई कोड लिखना नहीं है।

public static class JsonExtensions { 
    public static T As<T>(this JObject jobj) { 
     return JsonConvert.DeserializeObject<T>(JsonConvert.SerializeObject(jobj)); 
    } 

    public static List<T> ToList<T>(this JArray jarray) { 
     return JsonConvert.DeserializeObject<List<T>>(JsonConvert.SerializeObject(jarray)); 
    } 
} 


    [Test] 
    public void TestDeserializeRootObject() { 
     var json = @"{ id: 1, name: ""Dwight"" }"; 
     var jfoo = JsonConvert.DeserializeObject(json); 

     var foo = (jfoo as JObject).As<Foo>(); 
     Assert.AreEqual(1, foo.Id); 
     Assert.AreEqual("Dwight", foo.Name); 
    } 

    [Test] 
    public void TestDeserializeArray() { 
     var json = @"[ 
      { id: 1, name: ""Dwight"" } 
      , { id: 2, name: ""Pam"" } 
     ]"; 

     var foosArr = JsonConvert.DeserializeObject(json); 
     Assert.IsInstanceOf<JArray>(foosArr); 
     Assert.AreEqual(2, (foosArr as JArray).Count); 

     var foos = (foosArr as JArray).ToList<Foo>(); 
     Assert.AreEqual(2, foos.Count); 
     var foosDict = foos.ToDictionary(f => f.Name, f => f); 

     Assert.IsTrue(foosDict.ContainsKey("Dwight")); 
     var dwight = foosDict["Dwight"]; 
     Assert.AreEqual(1, dwight.Id); 
     Assert.AreEqual("Dwight", dwight.Name); 

     Assert.IsTrue(foosDict.ContainsKey("Pam")); 
     var pam = foosDict["Pam"]; 
     Assert.AreEqual(2, pam.Id); 
     Assert.AreEqual("Pam", pam.Name); 
    } 
1

एक मेरे लिए पहली जरूरत कास्ट:

((Newtonsoft.Json.Linq.JArray)myJArray).Select(item => (int)item).ToArray() 
29
myJArray.ToObject<int[]>(); 

तुम भी HashSet, सूची आदि

स्वीकार किए जाते हैं जवाब नेट के रूपांतरण पर निर्भर करता है निर्दिष्ट कर सकते हैं - इस तकनीक का उपयोग करता है JSON .NET के अलावा जो भी .NET अधिक परिदृश्यों के साथ काम करता है इसके अलावा।

+0

सवाल यह है: क्या यह MyCustomContract [] के रूप में सरणी के साथ काम करता है? –

+1

यह मेरे लिए काम करता था, जबकि स्वीकृत उत्तर नहीं था। मुझे नहीं पता कि क्यों, JSON.Net को किसी दिए गए ऑब्जेक्ट को पार्स करने के लिए सही वाक्यविन्यास खोजने के लिए वूडू जादू की आवश्यकता होती है। –

+0

स्वीकृत उत्तर की आवश्यकता है कि प्रकार अंतर्निहित .NET सुविधाओं का उपयोग करके डाला जा सके। ToObject रूपांतरण करने के लिए JSON.NET को बताता है जिसमें बुनियादी .NET वाले से कुछ अतिरिक्त रूपांतरण दिनचर्या उपलब्ध हैं। – DamienG

संबंधित मुद्दे