52 votes

Comment transformer un JArray de type Type en un tableau de Types ?

J'ai un JArray qui représente la sous-chaîne json [1,2,3] . J'aimerais en faire un int[] à la place.

Quelle est la bonne façon de procéder ? La meilleure façon que j'ai trouvée jusqu'à présent est de faire ce qui suit :

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

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

74voto

DamienG Points 3849
myJArray.ToObject<int[]>();

Vous pouvez également spécifier HashSet, List etc.

La réponse acceptée s'appuie sur la conversion de .NET - cette technique utilise celle de JSON.NET en plus de ce que .NET peut fournir et fonctionne donc avec plus de scénarios.

Il est également plus rapide car il n'utilise pas de générateur et de fermeture pour l'opération LINQ.

68voto

L.B Points 54001
int[] items = myJArray.Select(jv => (int)jv).ToArray();

2voto

Giscard Biamby Points 2403

Cette méthode est assez faible parce que vous devez reconvertir en chaîne de caractères, mais si vous faites quelque chose de rapide et sale, où le manque de performance n'a pas d'importance, j'utilise la méthode ci-dessous. Je l'aime parce que je n'ai pas à écrire de code pour faire correspondre les propriétés entre json/JObject et mes 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);
    }

2voto

Sourena Points 71

Une première nécessaire pour moi :

((Newtonsoft.Json.Linq.JArray)myJArray).Select(item => (int)item).ToArray()

1voto

Massimiliano Peluso Points 13357
int[] items = new int[myJArray.Count];

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

C'est la solution la plus rapide que vous puissiez faire. Le classique for est un peu plus rapide que le ForEach car vous accédez à l'élément par l'index (le foreach derrière la scène utilise l'interface IEnumerator).

ou si vous préférez :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X