【问题标题】:Deserialize Zomato JSON response in C#在 C# 中反序列化 Zomato JSON 响应
【发布时间】:2018-01-16 16:12:04
【问题描述】:

我正在使用 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: '无法将当前 JSON 对象(例如 {"name":"value"})反序列化为类型 'System.Collections.Generic.List`1[WindowsFormsApp1.CategoriesBottom]' 因为该类型需要正确反序列化的 JSON 数组(例如 [1,2,3])。

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

【问题讨论】:

  • 您好,错误表明您的 JSON 结构与您将数据反序列化到的类型不匹配。在这种情况下,您的类与 JSON 代码不匹配。尝试将数据反序列化为类别 []
  • @SpookKruger 你能告诉我怎么做吗?

标签: c# json serialization


【解决方案1】:

尝试更改属性以匹配 json 数据:

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

同时序列化你的 CategoriesTop 类型:

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

【讨论】:

  • 我尝试了你的建议,但我仍然有同样的错误
  • 抱歉没有很快理解,但是我应该在哪里写这行:var a = JsonConvert.DeserializeObject(responseData); ?
  • 我应该用你的替换包含 JsonConvert... 的行吗?
  • @RoyNasr 是的,正确。您将获得一个 CategoriesTop 实例而不是 List
【解决方案2】:

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

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

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

您还反序列化了一个不起作用的List&lt;CategoriesBottom&gt;,因为整个列表被包装在另一个对象(CategoriesTop)中。所以你宁愿做以下事情:

JsonConvert.DeserializeObject<CategoriesTop>(responseData);

【讨论】:

  • 而且 json2charp 服务非常有帮助
【解决方案3】:

使用RestSharp 从其他来源获取数据。 RestSharp 具有反序列化对类的响应的强大功能。

这是来自 RestSharp wiki 的示例:

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

这样你已经得到了结果。请查看文档以获取更多信息。可以直接使用nuget安装这个包,开始使用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-31
    • 1970-01-01
    • 2018-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多