2011-12-13 45 views
31

Tôi có một số JArray đại diện cho chuỗi con json [1,2,3]. Thay vào đó, tôi muốn biến nó thành một số int[].Cách tốt nhất để biến một kiểu dữ liệu kiểu JArray thành một mảng các kiểu?

Cách chính xác để thực hiện việc này là gì? Cách tốt nhất mà tôi đã tìm thấy cho đến nay là để làm như sau:

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

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

Trả lời

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

Tôi thích phương pháp này. Nó ngắn gọn và thanh lịch hơn. – Mahmoodvcs

+0

Tôi nghĩ tôi cũng thích câu trả lời này. Đôi khi tôi bỏ qua LINQ. – moswald

+1

Cũng có thể tránh việc truyền: myJArray.Select (jv => jv.Value ()). ToArray(); – mikebridge

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

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

này là giải pháp fastes bạn có thể làm. Cổ điển for là nhanh hơn so với ForEach một chút khi bạn truy cập vào mục bằng chỉ số (foreach đằng sau những cảnh sử dụng giao diện IEnumerator)

hoặc nếu bạn thích:

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

Trong khi tôi đang hy vọng cho một cái gì đó được xây dựng vào lớp JArray mà tôi đã nhìn, ít nhất điều này xác nhận với tôi rằng tôi đã không. – moswald

2

Đây là khá yếu vì bạn phải chuyển đổi trở lại thành một chuỗi, nhưng nếu bạn đang làm một cái gì đó nhanh chóng và bẩn, nơi hit hiệu suất sẽ không thành vấn đề, tôi sử dụng phương pháp dưới đây. Tôi thích nó vì tôi không phải viết bất kỳ mã nào để ánh xạ các thuộc tính giữa json/JObject và POCO của tôi.

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

một dàn diễn viên cần thiết đầu tiên đối với tôi:

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

Bạn cũng có thể chỉ định HashSet, Danh sách, vv

Câu trả lời được chấp nhận dựa trên chuyển đổi NET của - Kỹ thuật này sử dụng JSON NET của riêng ngoài những gì NET có thể cung cấp để làm việc với nhiều kịch bản.

+0

Câu hỏi đặt ra là: nó có hoạt động với các mảng dưới dạng MyCustomContract [] không? –

+1

Điều này làm việc cho tôi trong khi câu trả lời được chấp nhận thì không. Tôi không có ý tưởng tại sao, JSON.Net xuất hiện để yêu cầu ma thuật voodoo để tìm cú pháp chính xác để phân tích một đối tượng nhất định. –

+0

Câu trả lời được chấp nhận yêu cầu loại có thể truyền bằng cách sử dụng các tiện ích .NET tích hợp. ToObject yêu cầu JSON.NET thực hiện chuyển đổi, trong đó có một vài quy trình chuyển đổi bổ sung có sẵn ngoài các giao thức .NET cơ bản. – DamienG

Các vấn đề liên quan