2011-12-13 104 views
31

我有一个JArray表示json子串[1,2,3]。我想把它变成int[]如何将类型为Type的JArray转换为类型数组?

这样做的正确方法是什么?到目前为止,我已经找到了最好的办法是做到以下几点:

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

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

回答

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

我更喜欢这种方法。它简短而优雅。 – Mahmoodvcs 2012-09-26 18:02:13

+0

我想我也更喜欢这个答案。我有时忽略了LINQ。 – moswald 2012-12-31 17:19:56

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

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

这是fastes解决方案,你可以做。经典forForEach快一点,你通过索引访问项目(幕后在foreach使用IEnumerator接口)

或者如果你喜欢:

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

虽然我希望能够忽略一些内置于JArray类的东西,但至少这证实了我没有。 – moswald 2011-12-13 18:25:31

2

这是因为你必须将字符串转换回字符串,但是如果你正在做一些快速而肮脏的事情,性能下降并不重要,我使用下面的方法。我喜欢它,因为我不必编写任何代码来映射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); 
    } 
1

铸造首先需要对我来说:

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

还可以指定HashSet的,签单等

接受的答案依赖于.NET的转换 - 这种技术使用JSON除了.NET可以提供的.NET以外,.NET还可以支持更多的场景。

相关问题