Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在C中反序列化JSON Web响应#_C#_.net_Json_Rest_Javascriptserializer - Fatal编程技术网

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

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

我正在使用RESTAPI并获得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"
        }
    ]
}
我采用的方法是创建两个类(与我从中得到的结果一致)——一个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程序集,而不是像JSON.NET这样的第三方软件包。我知道JSON.NET可能会表现得更好,我也读过很多强调JSON.NET易用性的帖子。如果您坚持使用JSON.NET,请告诉我JSON.NET是如何处理根对象的

尽管如此,公认的答案将针对本机解决方案。问题是:
我如何使用本机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);