我有一个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;
}
我有一个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;
}
int[] items = myJArray.Select(jv => (int)jv).ToArray();
int[] items = new int[myJArray.Count];
for (int i=0; i < myJArray.Count;i++)
{
items[i] = (int)myJArray[i]
}
这是fastes解决方案,你可以做。经典for
比ForEach
快一点,你通过索引访问项目(幕后在foreach使用IEnumerator接口)
或者如果你喜欢:
JsonArray arr = JsonConvert.Import("[1,2,3,4]");
int[] nums = (int[]) arr.ToArray(typeof(int));
虽然我希望能够忽略一些内置于JArray类的东西,但至少这证实了我没有。 – moswald 2011-12-13 18:25:31
这是因为你必须将字符串转换回字符串,但是如果你正在做一些快速而肮脏的事情,性能下降并不重要,我使用下面的方法。我喜欢它,因为我不必编写任何代码来映射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);
}
铸造首先需要对我来说:
((Newtonsoft.Json.Linq.JArray)myJArray).Select(item => (int)item).ToArray()
myJArray.ToObject<int[]>();
还可以指定HashSet的,签单等
接受的答案依赖于.NET的转换 - 这种技术使用JSON除了.NET可以提供的.NET以外,.NET还可以支持更多的场景。
我更喜欢这种方法。它简短而优雅。 – Mahmoodvcs 2012-09-26 18:02:13
我想我也更喜欢这个答案。我有时忽略了LINQ。 – moswald 2012-12-31 17:19:56