2015-10-14 67 views
1

我正在使用REST API並獲取JSON格式的HTTP響應。 JSON字符串包含一個對象作爲第一個也是唯一的「頂級」或「根級」鍵,其中有一個對象數組作爲其值。反序列化C#中的JSON Web響應#

最後,我需要的陣列中的每個對象的傳遞到SQL查詢,我打算通過創建List並用foreach循環遍歷List做。

這裏的JSON響應的示例:

{ 
    "blueplates": [ 
     { 
      "Appetizer": 26, 
      "Salad": 21, 
      "Soup": "SheCrab", 
      "Entree": 6434, 
      "Side": 2303093, 
      "Desert": 0, 
      "Beverage": "Sweet Tea + SoCo" 
     }, 
     { 
      "Appetizer": 27, 
      "Salad": 21, 
      "Soup": "Tomato Bisque", 
      "Entree": 6434, 
      "Side": 2303093, 
      "Desert": 0, 
      "Beverage": "Lemonade + Rum" 
     }, 
     { 
      "Appetizer": 28, 
      "Salad": 21, 
      "Soup": "Peanut", 
      "Entree": 6434, 
      "Side": 2303093, 
      "Desert": 0, 
      "Beverage": "Ginger Ale + Whiskey" 
     } 
    ] 
} 

,我採取的方法是創建兩個類(與我從http://json2csharp.com/得到的結果是一致的) - 一個RootObject類和Blueplate類。

的類結構如下所示:

public class Blueplate 
{ 
    public int Appetizer { get; set; } 
    public int Salad { get; set; } 
    public string Soup { get; set; } 
    public int Entree { get; set; } 
    public int Side { get; set; } 
    public int Desert { get; set; } 
    public string Beverage { get; set; } 
} 

public class RootObject 
{ 
    public List<Blueplate> blueplates { get; set; }    
} 

我使用從System.Web命名空間的JavaScriptSerializer類。爲了驗證我對JavaScriptSerializer的基本用法,我嘗試手動重新格式化JSON,因此以下代碼編譯並將「Appetizer」鍵的值寫入控制檯,並在每個值顯示後等待鍵盤輸入:

var response = "[{\"Appetizer\":26,\"Salad\":21,\"Soup\":\"SheCrab\",\"Entree\":6434,\"Side\":2303093,\"Desert\":0,\"Beverage\":\"Sweet Tea + SoCO\"}, {\"Appetizer\":27,\"Salad\":21,\"Soup\":\"Tomato Bisque\",\"Entree\":6434,\"Side\":2303093,\"Desert\":0,\"Beverage\":\"Lemonade + Rum\"}, {\"Appetizer\":28,\"Salad\":21,\"Soup\":\"Peanut\",\"Entree\":6434,\"Side\":2303093,\"Desert\":0,\"Beverage\":\"Ginger Ale + Whiskey\"}]"; 

     JavaScriptSerializer deSerializedResponse = new JavaScriptSerializer(); 
     List<Blueplate> blueplates = (List<Blueplate>)deSerializedResponse.Deserialize(response, typeof(List<Blueplate>)); 

      for (int i = 0; i < blueplates.Count; i++) 
      { 
       Console.WriteLine(blueplates[i].Appetizer); 
       Console.ReadLine(); 

      } 

我遇到的問題是處理根標記和使用RootObject類。

我使用如下語句的變化試過,用for變化和foreach環路沿:

RootObject rootObject = (RootObject) deSerializedResponse.Deserialize(response, typeof(RootObject)); 

顯然,我很困惑的幾個要點:

  • 映射根將JSON對象映射到C#RootObject類
  • 將根JSON對象的數組值中的對象映射到C#藍板類,OR
  • 映射在根JSON對象的數組值的對象到RootObject類
  • 枚舉的blueplates屬性和循環在RootObject類
  • 鑄造的blueplates屬性或轉換由返回的對象類型該Deserialize方法BlueplateList一個對象

最後,請注意,我希望ŧ o使用本地微軟程序集,而不是像JSON.NET這樣的第三方軟件包。我明白,JSON.NET可能會更好,我已經閱讀了一些強調JSON.NET易用性的文章。如果您堅持使用JSON.NET,請告訴我JSON.NET如何處理根對象。

儘管如此,接受的答案將解決本機解決方案。現在的問題是: 如何使用本機Microsoft類JavaScriptSerializer將具有對象數組作爲其值的根對象反序列化JSON響應,其中目標值是陣列中的對象,以便將List傳遞給一個SQL查詢?

編輯:改變的foreach

+0

代碼是否'deSerializedResponse.Deserialize(響應的typeof(RootObject));'不是從你上面的例子工作?它看起來應該工作正常。你會得到什麼錯誤? – CodingWithSpike

+0

@CodingWithSpike是的,代碼'deSerializedResponse.Deserialize(response,typeof(RootObject));'確實有效。然而,我無法驗證它在工作,直到我遵循@ t.enix的答案並重新編寫了我的「foreach」循環。我不知道如何迭代Blueplates的'List',它是RootObject的'List '屬性。它要麼輸出'RootObject'或'rootObject =',要麼無法編譯錯誤'foreach語句不能對類型爲RootObject的變量進行操作,因爲RootObject不包含'GetEnumerator'的公共定義。 –

回答

1

第一個JSON時用我的測試工作。

var response = "{blueplates :[{\"Appetizer\":26,\"Salad\":21,\"Soup\":\"SheCrab\",\"Entree\":6434,\"Side\":2303093,\"Desert\":0,\"Beverage\":\"Sweet Tea + SoCO\"}, {\"Appetizer\":27,\"Salad\":21,\"Soup\":\"Tomato Bisque\",\"Entree\":6434,\"Side\":2303093,\"Desert\":0,\"Beverage\":\"Lemonade + Rum\"}, {\"Appetizer\":28,\"Salad\":21,\"Soup\":\"Peanut\",\"Entree\":6434,\"Side\":2303093,\"Desert\":0,\"Beverage\":\"Ginger Ale + Whiskey\"}]}"; 

    JavaScriptSerializer deSerializedResponse = new JavaScriptSerializer(); 
    RootObject root = (RootObject)deSerializedResponse.Deserialize(response, typeof(RootObject)); 

    foreach (Blueplate plate in root.blueplates) 
    { 
     Console.WriteLine(plate.Appetizer); 
     Console.ReadLine(); 
    } 
+0

謝謝你的正確答案。您更正了我的循環方法,並且將'RootObject'實例的代碼驗證爲'deserializedResponse'。我沒有正確地訪問'RootObject'的'List '屬性,正如我在@CodingWithSpike發表的評論中詳細描述的那樣。根據你的回答,我無法驗證'Deserialize'方法的結果,直到我修復了'foreach'循環。 –

0
RootObject objRootObject = new RootObject(); 
HttpResponseMessage apioresponse = { "blueplates": [ Your response] } ; 
string responseString = await apioresponse.Content.ReadAsStringAsync(); 
objRootObject = JsonConvert.DeserializeObject<RootObject>(responseString); 
+0

你想評論一下你的答案嗎?單獨發佈代碼通常不會對幫助徹底理解問題有所幫助。 – Matthias

+0

@Matthias謝謝 我是新用戶,在這裏只是學習,並嘗試幫助別人,如果我可以 –