2011-12-13 15 views

risposta

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

Preferisco questo metodo. È breve e più elegante. – Mahmoodvcs

+0

Penso di preferire anche questa risposta. A volte trascuro LINQ. – moswald

+1

È anche possibile evitare il casting: 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] 
} 

questa è la soluzione di rapido si può fare. Il classico for è un po 'più veloce rispetto al ForEach come si accede alla voce per l'indice (il foreach dietro le quinte utilizza l'interfaccia IEnumerator)

o se si preferisce:

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

Mentre speravo in qualcosa di costruito nella classe JArray che stavo trascurando, almeno questo conferma con me che non l'ho fatto. – moswald

2

Questo è abbastanza debole perché devi convertire nuovamente in una stringa, ma se stai facendo qualcosa di veloce e sporco, in cui il successo in termini di prestazioni non è importante, io uso il metodo seguente. Mi piace perché non devo scrivere alcun codice per mappare le proprietà tra json/JObject e i miei POCO.

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

un cast necessaria prima volta per me:

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

è anche possibile specificare HashSet, Lista ecc

La risposta accettata si basa sulla conversione di NET - questa tecnica utilizza JSON Lo stesso di .NET oltre a ciò che .NET può fornire, quindi funziona con più scenari.

+0

La domanda è: funziona con gli array sotto forma di MyCustomContract []? –

+1

Questo ha funzionato per me mentre la risposta accettata no. Non ho idea del perché, JSON.Net sembra richiedere la magia voodoo per trovare la sintassi corretta per analizzare un dato oggetto. –

+0

La risposta accettata richiede che il tipo possa trasmettere utilizzando le funzionalità .NET integrate. ToObject indica a JSON.NET di eseguire la conversione che ha alcune routine di conversione aggiuntive disponibili oltre quelle di base .NET. – DamienG

Problemi correlati