2011-12-13 5 views

Respuesta

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

Prefiero este método. Es breve y más elegante. – Mahmoodvcs

+0

Creo que prefiero esta respuesta también. A veces pasé por alto LINQ. – moswald

+1

También es posible evitar la conversión: 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] 
} 

Ésta es la solución con mayor crecimiento que puede hacer. El clásico for es un poco más rápido que el ForEach a medida que accede el artículo por el índice (el foreach detrás de la escena utiliza la interfaz IEnumerator)

o si lo prefiere:

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

Mientras esperaba algo incorporado a la clase JArray que estaba pasando por alto, al menos esto confirma conmigo que no es así. – moswald

2

Este es bastante débil porque tienes que volver a convertir en una cadena, pero si estás haciendo algo rápido y sucio, donde el rendimiento no importa, utilizo el siguiente método. Me gusta porque no tengo que escribir ningún código para mapear propiedades entre json/JObject y mi 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 elenco necesario primero para mí:

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

También puede especificar HashSet, etc. Lista

La respuesta aceptada se basa en la conversión de .NET - esta técnica utiliza JSON .NET además de lo que .NET puede proporcionar, por lo que funciona con más escenarios.

+0

La pregunta es: ¿funciona con arreglos en forma de MyCustomContract []? –

+1

Esto funcionó para mí, mientras que la respuesta aceptada no. No tengo idea de por qué, JSON.Net parece requerir magia vudú para encontrar la sintaxis correcta para analizar un objeto determinado. –

+0

La respuesta aceptada requiere que el tipo pueda emitirse utilizando las funciones incorporadas de .NET. ToObject le dice a JSON.NET que haga la conversión que tiene algunas rutinas de conversión adicionales disponibles más allá de las básicas .NET. – DamienG

Cuestiones relacionadas