C# 在C中反序列化JSON Web响应#
我正在使用RESTAPI并获得JSON格式的HTTP响应。JSON字符串包含一个对象作为第一个也是唯一的“顶级”或“根级别”键,其值为一个对象数组 最后,我需要将数组中的每个对象传递给SQL查询,我打算通过创建一个C# 在C中反序列化JSON Web响应#,c#,.net,json,rest,javascriptserializer,C#,.net,Json,Rest,Javascriptserializer,我正在使用RESTAPI并获得JSON格式的HTTP响应。JSON字符串包含一个对象作为第一个也是唯一的“顶级”或“根级别”键,其值为一个对象数组 最后,我需要将数组中的每个对象传递给SQL查询,我打算通过创建一个List并使用foreach循环迭代List来实现这一点 以下是JSON响应的示例: { "blueplates": [ { "Appetizer": 26, "Salad": 21, "S
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"
}
]
}
我采用的方法是创建两个类(与我从中得到的结果一致)——一个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; }
}
显然,我对以下几点感到困惑:
- 将根JSON对象映射到C#RootObject类
- 将根JSON对象的数组值中的对象映射到C#Blueplate类,或
- 将根JSON对象的数组值中的对象映射到根对象类的
属性blueplates
- 在RootObject类的
属性上枚举和循环blueplates
- 将
方法返回的对象类型转换为反序列化
对象的
列表
我如何使用本机Microsoft类JavaScriptSerializer对一个JSON响应进行反序列化,该JSON响应的值是一个对象数组,其中目标值是数组中的对象,以将
列表传递给SQL查询?
第一个JSON与我的测试一起工作:
编辑:更改为foreach
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();
}
rootobjectobjrootobject=newrootobject();
HttpResponseMessageAPIOResponse={“blueplates”:[您的响应]};
string responseString=await apioresponse.Content.ReadAsStringAsync();
objRootObject=JsonConvert.DeserializeObject(responseString);
代码是否反序列化响应。反序列化(响应,类型(RootObject))代码>从上面的示例看不起作用?看起来这样应该行得通。您会遇到什么错误?@CodingWithSpike Yes,代码deSerializedResponse.Deserialize(response,typeof(RootObject))代码>确实有效。然而,直到我遵循@t.enix的答案并重新编写我的foreach
循环,我才能验证它是否有效。我不明白如何迭代blueplates的List
,这是RootObject的List
属性。它正在输出RootObject
或RootObject=
,或未能编译,错误为foreach语句无法对RootObject类型的变量进行操作,因为RootObject不包含“GetEnumerator
的公共定义。感谢您给出了正确的答案。您纠正了我的循环方法,并将我的RootObject
实例代码验证为反序列化响应。我没有正确访问RootObject
的列表
属性,正如我在@CodingWithSpike回复评论时所详述的那样。我无法验证反序列化
方法的结果,直到根据您的答案修复了foreach
循环。是否要对您的答案稍加评论;单独发布代码通常对彻底理解问题没有多大帮助。@Matthias谢谢,我是这里的新用户,只是在学习,如果可以的话,尝试帮助别人
RootObject rootObject = (RootObject) deSerializedResponse.Deserialize(response, typeof(RootObject));
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();
}
RootObject objRootObject = new RootObject();
HttpResponseMessage apioresponse = { "blueplates": [ Your response] } ;
string responseString = await apioresponse.Content.ReadAsStringAsync();
objRootObject = JsonConvert.DeserializeObject<RootObject>(responseString);