2014-03-28 59 views
0

我有一些JSON數據,我設法獲得並放置在一個動態類型。JSON.NET C#獲得訪問反序列化對象

這裏是它如何看起來像JSON。

{"fruits":{"a":"orange","b":"banana","c":"apple"},"numbers":[1,2,3,4,5,6],"holes":{"0":"first","5":"second","6":"third"}} 

這裏是我如何使用動態類型收集它。

dynamic myObj =JsonConvert.DeserializeObject(output); 

我需要找到一種方法來單獨在某種陣列的對象和地點,這樣我可以得到的值的保持。假設我想獲得hole數組並獲得某種循環中所有值的訪問權限。

任何意見將不勝感激。

謝謝

+0

創建表示JSON對象的結構類和反序列化JSON數據轉換成類。請參閱citronas回答一個示例。 – Maritim

回答

3

看看System.Web.Script.Serialization.JavaScriptSerializer

可以反序列化JSON字符串轉換成強類型類,像這樣:

數據類

public class AutocompleteAction 
{ 
    public String action { get; set; } 
} 

你必須嵌套類。那麼語法將類似於此parse google maps geocode json response to object using Json.Net

使用

string json = // your json string 
JavaScriptSerializer js = new JavaScriptSerializer(); 
AutocompleteAction jsonObject = js.Deserialize<AutocompleteAction>(json); 
switch (jsonObject.action) 
{ 
    // 
} 
+0

我同意100%,但這更多的是對OP的說明。你的json對象只有1個數組,其他的只是對象的屬性。這似乎是動態的,並且會使創建課程變得非常困難。如果它是一個對象數組,則可以執行一組鍵值對。 – Smeegs

+0

我理解了OP的以下陳述「假設我想弄個孔陣列並獲得對某種循環中所有值的訪問權限。」因爲他會知道在設計時出現哪些鍵。在這種情況下,在我看來,創建這些類將是一個有效的選擇。 – citronas

+0

'string output = writeClient.Get (「mykey」); AutocompleteAction jsonObject = js.Deserialize (output);'當我在我的控制檯應用程序中將它分解時,它現在是空的。那是對的嗎? – user3036965

0

我使用Json.NET這樣做到底。希望對某人有用。會喜歡評論和批評,因爲可能有更好的方法。

string output = writeClient.Get<string>("mykey"); 
      JObject myObj = (JObject)JsonConvert.DeserializeObject(output); 
      JObject fruits = myObj["fruits"] as JObject; 
      JObject holes = myObj["holes"] as JObject; 

      foreach (var fruit in fruits) 
      { 

       MyTestClass myClass = new MyTestClass(); 
       myClass.myKey = fruit.Key; 
       myClass.myVal = fruit.Value.ToString(); 

      } 

      JToken nums = myObj["nums"]; 
      IEnumerable<string> allString = nums.Children().Values<string>(); 

      foreach (var myVal in allString) 
      { 
       // do something.. 
      }