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

时间:2018-01-16 07:29:27

标签: c# json serialization

我正在使用Zomato API,我收到以下JSON响应:

{
"categories": [
    {
      "categories": {
        "id": 1,
        "name": "Delivery"
      }
    },
    {
      "categories": {
        "id": 2,
        "name": "Dine-out"
      }
    },
    {
      "categories": {
        "id": 3,
        "name": "Nightlife"
      }
    },
    {
      "categories": {
        "id": 4,
        "name": "Catching-up"
      }
    },
    {
      "categories": {
        "id": 5,
        "name": "Takeaway"
      }
    },
    {
      "categories": {
        "id": 6,
        "name": "Cafes"
      }
    },
    {
      "categories": {
        "id": 7,
        "name": "Daily Menus"
      }
    },
    {
      "categories": {
        "id": 8,
        "name": "Breakfast"
      }
    },
    {
      "categories": {
        "id": 9,
        "name": "Lunch"
      }
    },
    {
      "categories": {
        "id": 10,
        "name": "Dinner"
      }
    },
    {
      "categories": {
        "id": 11,
        "name": "Pubs & Bars"
      }
    },
    {
      "categories": {
        "id": 13,
        "name": "Pocket Friendly Delivery"
      }
    },
    {
      "categories": {
        "id": 14,
        "name": "Clubs & Lounges"
      }
    }
  ]
}

我想反序列化此响应,并创建了以下类:

public class CategoriesTop
{
    public List<CategoriesBottom> categories { get; set; }
}
public class CategoriesBottom
{
    public Categorie categorie { get; set; }
}
public class Categorie
{
    public int id { get; set; }
    public string name { get; set; }
}

我正在使用此代码来获取响应:

public Form1()
    {
        InitializeComponent();

        HttpWebRequest webRequest =
                WebRequest.Create("https://developers.zomato.com/api/v2.1/categories")
                        as HttpWebRequest;
        HttpWebResponse webResponse = null;
        webRequest.Headers.Add("X-Zomato-API-Key", "509ce9e4863960cdc076fb3817cc238e");
        //you can get KeyValue by registering with Zomato.
        webRequest.Method = "GET";
        webResponse = (HttpWebResponse)webRequest.GetResponse();
        if (webResponse.StatusCode == HttpStatusCode.OK)
        {
            StreamReader responseReader = new
                               StreamReader(webResponse.GetResponseStream());
            string responseData = responseReader.ReadToEnd();
            //XmlDocument doc = new XmlDocument();
            //doc.LoadXml(responseData);
            //XmlNodeReader xmlReader = new XmlNodeReader(doc);
            //DataSet ds = new DataSet();
            //ds.ReadXml(xmlReader);
            List<CategoriesBottom> l = JsonConvert.DeserializeObject<List<CategoriesBottom>>(responseData);
            foreach(CategoriesBottom c in l)
            {
                cmbCatName.Items.Add(c.categorie.name);
            }
        }
    }

当我运行程序时,我在JSON.Convert行上收到错误:

  

Newtonsoft.Json.JsonSerializationException:&#39;无法将当前JSON对象(例如{&#34; name&#34;:&#34; value&#34;})反序列化为类型&#39; System.Collections .Generic.List`1 [WindowsFormsApp1.CategoriesBottom]&#39;因为该类型需要JSON数组(例如[1,2,3])才能正确反序列化。

所以我认为我的反序列化代码有问题,或者类定义不正确。任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:2)

尝试将属性更改为与json数据匹配:

public class CategoriesBottom
{
    public Categorie categories { get; set; }
}

同时序列化您的 CategoriesTop 类型:

CategoriesTop ct = JsonConvert.DeserializeObject<CategoriesTop>(responseData);

答案 1 :(得分:1)

为JSON结构生成C#类的最简单方法是通过json2csharp在线服务。

第一个问题是CategoriesBottom中的您的属性被称为categorie,而结构包含categories

public class CategoriesBottom
{
    [JsonProperty( "categories" )]
    public Categorie categorie { get; set; }
}

此外,您反序列化了一个无效的List<CategoriesBottom>,因为整个列表都包含在另一个对象(CategoriesTop)中。所以你宁愿做以下事情:

JsonConvert.DeserializeObject<CategoriesTop>(responseData);

答案 2 :(得分:1)

使用RestSharp从其他来源获取数据。 RestSharp有一个很好的功能来反序列化对类的响应。

这是来自RestSharp wiki的示例:

 IRestResponse<Person> response2 = client.Execute<Person>(request);
 var name = response2.Data.Name;

有了这个你已经得到了结果。请查看文档以获取更多信息。您可以使用nuget直接安装此软件包并开始使用它。