如何最好地将类型类型的 JArray 转换为类型数组



我有一个JArray,表示 json 子字符串[1,2,3]。我想把它变成一个int[]

正确的方法是什么?到目前为止,我发现的最好的方法是执行以下操作:

int[] items = new int[myJArray.Count];
int i = 0;
foreach (int item in myJArray)
{
    items[i++] = item;
}
myJArray.ToObject<int[]>();

您还可以指定HashSet,List等。

接受的答案依赖于 。NET 的转换 - 此技术使用 JSON。除了 .NET 可以提供的功能外,NET 还具有自己的功能,因此适用于更多方案。

它也更快,因为它没有使用生成器和闭包进行LINQ操作。

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

我首先需要的演员阵容:

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

这很弱,因为您必须转换回字符串,但是如果您正在做一些快速而肮脏的事情,性能影响无关紧要,我使用以下方法。我喜欢它,因为我不必编写任何代码来映射 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);
    }
int[] items = new int[myJArray.Count];
for (int i=0; i < myJArray.Count;i++)
{
    items[i] = (int)myJArray[i]
}

这是您可以做的快速解决方案。经典forForEach快一点,因为您可以通过索引访问项目(幕后的foreach使用IEnumerator接口(

或者如果您愿意:

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

相关内容

  • 没有找到相关文章

最新更新