反序列化C#中的JSON Web响应#
我正在使用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
第一个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();
}
谢谢你的正确答案。您更正了我的循环方法,并且将'RootObject'实例的代码验证为'deserializedResponse'。我没有正确地访问'RootObject'的'List
RootObject objRootObject = new RootObject();
HttpResponseMessage apioresponse = { "blueplates": [ Your response] } ;
string responseString = await apioresponse.Content.ReadAsStringAsync();
objRootObject = JsonConvert.DeserializeObject<RootObject>(responseString);
你想评论一下你的答案吗?单独发布代码通常不会对帮助彻底理解问题有所帮助。 – Matthias
@Matthias谢谢 我是新用户,在这里只是学习,并尝试帮助别人,如果我可以 –
代码是否'deSerializedResponse.Deserialize(响应的typeof(RootObject));'不是从你上面的例子工作?它看起来应该工作正常。你会得到什么错误? – CodingWithSpike
@CodingWithSpike是的,代码'deSerializedResponse.Deserialize(response,typeof(RootObject));'确实有效。然而,我无法验证它在工作,直到我遵循@ t.enix的答案并重新编写了我的“foreach”循环。我不知道如何迭代Blueplates的'List',它是RootObject的'List'属性。它要么输出'RootObject'或'rootObject =',要么无法编译错误'foreach语句不能对类型为RootObject的变量进行操作,因为RootObject不包含'GetEnumerator'的公共定义。 –