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

时间:2015-10-14 16:13:21

标签: c# .net json rest javascriptserializer

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

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

我正在采取的方法是创建两个类(与我从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类。我尝试手动重新格式化JSON以验证我对JavaScriptSerializer的基本用法,因此以下代码编译并将“Appetizer”键的值写入控制台,等待显示每个值后的键盘输入:< / p>

 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();

            }

我遇到的问题是处理root标记并使用RootObject类。

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

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

显然,我对以下几点感到困惑:

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

最后,请注意我希望使用本机Microsoft程序集,而不是像JSON.NET这样的第三方软件包。据我所知,JSON.NET可能表现更好,而且我已经阅读了许多强调JSON.NET易用性的帖子。如果您坚持使用JSON.NET,请告诉我JSON.NET如何处理根对象。

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

RootObject objRootObject = new RootObject();
HttpResponseMessage apioresponse = { "blueplates": [ Your response] } ;
string responseString = await apioresponse.Content.ReadAsStringAsync();
objRootObject = JsonConvert.DeserializeObject<RootObject>(responseString);