我正在使用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
方法Blueplate
的List
一個對象
最後,請注意,我希望ŧ o使用本地微軟程序集,而不是像JSON.NET這樣的第三方軟件包。我明白,JSON.NET可能會更好,我已經閱讀了一些強調JSON.NET易用性的文章。如果您堅持使用JSON.NET,請告訴我JSON.NET如何處理根對象。
儘管如此,接受的答案將解決本機解決方案。現在的問題是: 如何使用本機Microsoft類JavaScriptSerializer將具有對象數組作爲其值的根對象反序列化JSON響應,其中目標值是陣列中的對象,以便將List
傳遞給一個SQL查詢?
編輯:改變的foreach
代碼是否'deSerializedResponse.Deserialize(響應的typeof(RootObject));'不是從你上面的例子工作?它看起來應該工作正常。你會得到什麼錯誤? – CodingWithSpike
@CodingWithSpike是的,代碼'deSerializedResponse.Deserialize(response,typeof(RootObject));'確實有效。然而,我無法驗證它在工作,直到我遵循@ t.enix的答案並重新編寫了我的「foreach」循環。我不知道如何迭代Blueplates的'List',它是RootObject的'List'屬性。它要麼輸出'RootObject'或'rootObject =',要麼無法編譯錯誤'foreach語句不能對類型爲RootObject的變量進行操作,因爲RootObject不包含'GetEnumerator'的公共定義。 –