2015-10-14 71 views
1

我正在使用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方法BlueplateList一个对象

最后,请注意,我希望ŧ o使用本地微软程序集,而不是像JSON.NET这样的第三方软件包。我明白,JSON.NET可能会更好,我已经阅读了一些强调JSON.NET易用性的文章。如果您坚持使用JSON.NET,请告诉我JSON.NET如何处理根对象。

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

编辑:改变的foreach

+0

代码是否'deSerializedResponse.Deserialize(响应的typeof(RootObject));'不是从你上面的例子工作?它看起来应该工作正常。你会得到什么错误? – CodingWithSpike

+0

@CodingWithSpike是的,代码'deSerializedResponse.Deserialize(response,typeof(RootObject));'确实有效。然而,我无法验证它在工作,直到我遵循@ t.enix的答案并重新编写了我的“foreach”循环。我不知道如何迭代Blueplates的'List',它是RootObject的'List '属性。它要么输出'RootObject'或'rootObject =',要么无法编译错误'foreach语句不能对类型为RootObject的变量进行操作,因为RootObject不包含'GetEnumerator'的公共定义。 –

回答

1

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

谢谢你的正确答案。您更正了我的循环方法,并且将'RootObject'实例的代码验证为'deserializedResponse'。我没有正确地访问'RootObject'的'List '属性,正如我在@CodingWithSpike发表的评论中详细描述的那样。根据你的回答,我无法验证'Deserialize'方法的结果,直到我修复了'foreach'循环。 –

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

你想评论一下你的答案吗?单独发布代码通常不会对帮助彻底理解问题有所帮助。 – Matthias

+0

@Matthias谢谢 我是新用户,在这里只是学习,并尝试帮助别人,如果我可以 –