Подтвердить что ты не робот

Как лучше всего превратить JArray типа Type в массив типов?

У меня есть JArray, который представляет подстроку json [1,2,3]. Вместо этого я хотел бы превратить его в int[].

Каков правильный способ сделать это? Лучший способ, который я нашел до сих пор, - сделать следующее:

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

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

Ответ 1

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

Ответ 2

myJArray.ToObject<int[]>();

Вы также можете указать HashSet, List и т.д.

Принятый ответ основан на преобразовании .NET. Этот метод использует собственный JSON.NET в дополнение к тому, что .NET может обеспечить, поэтому работает с большим количеством сценариев.

Ответ 3

Это довольно слабо, потому что вам нужно преобразовать обратно в строку, но если вы делаете что-то быстрое и грязное, где удар производительности не имеет значения, я использую метод ниже. Мне нравится, потому что мне не нужно писать код для сопоставления свойств между json/JObject и моими 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);
    }

Ответ 4

Мне нужна первая броска:

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

Ответ 5

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

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

это решение поститься, которое вы можете сделать. Классический for немного быстрее, чем ForEach при доступе к элементу по индексу (foreach за сценой использует интерфейс IEnumerator)

или если вы предпочитаете:

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