在 C# 中反序列化 JSON Web 响应
Deserialize JSON Web Response in C#
我正在使用 REST API 并获得 JSON 格式的 HTTP 响应。 JSON 字符串包含一个对象作为第一个也是唯一的 "top-level" 或 "root-level" 键,并以对象数组作为其值。
最终,我需要将数组中的每个对象传递给 SQL 查询,我打算通过创建 List
并迭代 List
来实现foreach
循环。
这是 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"
}
]
}
我采用的方法是创建两个 classes(与我从 http://json2csharp.com/ 得到的结果一致)——一个 RootObject class 和一个 Blueplate class.
classes 的结构如下:
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 class。我尝试手动重新格式化 JSON 以验证我对 JavaScriptSerializer 的基本用法,因此以下代码编译并将 "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 class。
我尝试使用如下语句的变体,以及 for
和 foreach
循环的变体:
RootObject rootObject = (RootObject) deSerializedResponse.Deserialize(response, typeof(RootObject));
显然,我有几点感到困惑:
- 将根 JSON 对象映射到 C# RootObject class
- 将根 JSON 对象的数组值中的对象映射到 C# Blueplate class、或
- 将根 JSON 对象的数组值中的对象映射到 RootObject class
的 blueplates
属性
- 枚举和循环 RootObject class
的 blueplates
属性
- 将
Deserialize
方法返回的对象类型转换为 Blueplate
个对象的 List
最后,请注意我希望使用本机 Microsoft 程序集,而不是像 JSON.NET 这样的第三方程序包。我知道 JSON.NET 的性能可能更好,而且我读过一些强调 JSON.NET 易用性的帖子。如果您坚持 JSON.NET,请指教 JSON.NET 如何处理根对象。
不过,接受的答案将解决本机解决方案。问题是:
我如何使用本机 Microsoft class JavaScriptSerializer 反序列化 JSON 响应,根对象的值是一个对象数组,其中目标值是数组,将 List
传递给 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();
}
RootObject objRootObject = new RootObject();
HttpResponseMessage apioresponse = { "blueplates": [ Your response] } ;
string responseString = await apioresponse.Content.ReadAsStringAsync();
objRootObject = JsonConvert.DeserializeObject<RootObject>(responseString);
我正在使用 REST API 并获得 JSON 格式的 HTTP 响应。 JSON 字符串包含一个对象作为第一个也是唯一的 "top-level" 或 "root-level" 键,并以对象数组作为其值。
最终,我需要将数组中的每个对象传递给 SQL 查询,我打算通过创建 List
并迭代 List
来实现foreach
循环。
这是 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"
}
]
}
我采用的方法是创建两个 classes(与我从 http://json2csharp.com/ 得到的结果一致)——一个 RootObject class 和一个 Blueplate class.
classes 的结构如下:
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 class。我尝试手动重新格式化 JSON 以验证我对 JavaScriptSerializer 的基本用法,因此以下代码编译并将 "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 class。
我尝试使用如下语句的变体,以及 for
和 foreach
循环的变体:
RootObject rootObject = (RootObject) deSerializedResponse.Deserialize(response, typeof(RootObject));
显然,我有几点感到困惑:
- 将根 JSON 对象映射到 C# RootObject class
- 将根 JSON 对象的数组值中的对象映射到 C# Blueplate class、或
- 将根 JSON 对象的数组值中的对象映射到 RootObject class 的
- 枚举和循环 RootObject class 的
- 将
Deserialize
方法返回的对象类型转换为Blueplate
个对象的List
blueplates
属性
blueplates
属性
最后,请注意我希望使用本机 Microsoft 程序集,而不是像 JSON.NET 这样的第三方程序包。我知道 JSON.NET 的性能可能更好,而且我读过一些强调 JSON.NET 易用性的帖子。如果您坚持 JSON.NET,请指教 JSON.NET 如何处理根对象。
不过,接受的答案将解决本机解决方案。问题是:
我如何使用本机 Microsoft class JavaScriptSerializer 反序列化 JSON 响应,根对象的值是一个对象数组,其中目标值是数组,将 List
传递给 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();
}
RootObject objRootObject = new RootObject();
HttpResponseMessage apioresponse = { "blueplates": [ Your response] } ;
string responseString = await apioresponse.Content.ReadAsStringAsync();
objRootObject = JsonConvert.DeserializeObject<RootObject>(responseString);