2011-12-13 213 views

答えて

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

私はこの方法が好きです。簡単でエレガントです。 – Mahmoodvcs

+0

私はこの答えも好きだと思います。私は時々LINQを見落とします。 – moswald

+1

キャストを避けることもできます:myArray.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] 
} 

これは、あなたが行うことができますfastesソリューションです:私は今のところ見つけた最良の方法は、次の操作を実行することです。古典forあなたは、インデックス(シーンの背後にあるforeachのは、IEnumeratorインターフェイスを使用しています)

またはあなたが好む場合によって項目にアクセスとして少し速くForEachより:これは

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

私が見落としていたJArrayクラスに組み込まれているものを期待していましたが、少なくともこれは私にはないことがわかりました。 – moswald

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

Aが私のために最初に必要なキャスト:

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

あなたはまた、HashSetの、リストなどの受け入れ答えは、.NETの変換に依存してい

を指定することができます - この技術はJSONを使用しています.NETが提供できるものに加えて、.NET自体も、より多くのシナリオで動作します。

+0

質問は:それはMyCustomContract []の形式の配列で動作するのでしょうか? –

+1

これは受け入れられた答えが私には役に立たなかった。私はなぜJSON.Netが特定のオブジェクトを解析するための正しい構文を見つけるためにブードゥー・マジックを必要とするように思われるのか分かりません。 –

+0

受け入れられる答えでは、型が組み込みの.NET機能を使用してキャストできる必要があります。 ToObjectは、JSON.NETに変換を実行するように指示します。この変換には、基本的な.NETの変換ルーチン以外にもいくつかの変換ルーチンが用意されています。 – DamienG