在c#中反序列化JSON Web响应

本文关键字:Web 响应 JSON 反序列化 | 更新日期: 2023-09-27 18:17:46

我正在使用REST API并以JSON格式获得HTTP响应。JSON字符串包含一个对象作为第一个也是唯一的"顶级"或"根级"键,其值为一个对象数组。

最后,我需要将数组中的每个对象传递给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; }              
}

我正在使用JavaScriptSerializer类从系统。网络名称空间。为了验证我对JavaScriptSerializer的基本用法,我尝试手动重新格式化JSON,因此下面的代码编译并将"开胃菜"键的值写入控制台,在每个值显示后等待键盘输入:

 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类。

我尝试使用以下语句的变体,以及forforeach循环的变体:

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

显然,我在几个问题上感到困惑:

  • 将根JSON对象映射到c# RootObject类
  • 将根JSON对象的数组值中的对象映射到c# Blueplate类,
  • 将根JSON对象的数组值映射到RootObject类的blueplates属性
  • 枚举和循环RootObject类的blueplates属性
  • Deserialize方法返回的对象类型强制转换为Blueplate对象的List

最后,请注意,我希望使用本地微软程序集,而不是第三方包,如JSON.NET。我理解JSON。. NET可能会表现得更好,我读过很多强调JSON的文章。. NET的易用性。如果您坚持使用JSON。. NET,请开导我如何JSON。. NET正在处理根对象。

仍然,接受的答案将解决一个本地解决方案。问题是:我如何使用本地微软类JavaScriptSerializer反序列化JSON响应的根对象,具有对象数组作为其值,其中的目标值是数组中的对象,传递List到SQL查询?

在c#中反序列化JSON Web响应

第一个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);