【问题标题】:Deserialize RESTSharp JSON Response反序列化 RESTSharp JSON 响应
【发布时间】:2019-12-28 03:04:23
【问题描述】:

我正在开展一个从 NOAA 收集数据的项目。我无法弄清楚如何使响应可用。

这就是 NOAA 的 API 响应对我的调用的样子:

{
    "metadata": {
        "resultset": {
            "offset": 1,
            "count": 38859,
            "limit": 2
        }
    },
    "results": [
        {
            "mindate": "1983-01-01",
            "maxdate": "2019-12-24",
            "name": "Abu Dhabi, AE",
            "datacoverage": 1,
            "id": "CITY:AE000001"
        },
        {
            "mindate": "1944-03-01",
            "maxdate": "2019-12-24",
            "name": "Ajman, AE",
            "datacoverage": 0.9991,
            "id": "CITY:AE000002"
        }
    ]
}

我使用 JSON2CSharp.com 将结果集转换为我需要的类。下面是相关代码:

public class NOAA
{
    public class Resultset
    {
        public int offset { get; set; }
        public int count { get; set; }
        public int limit { get; set; }
    }

    public class Metadata
    {
        public Resultset resultset { get; set; }
    }
    public class Location
    {
        public string mindate { get; set; }
        public string maxdate { get; set; }
        public string name { get; set; }
        public double datacoverage { get; set; }
        public string id { get; set; }
    }
    public class RootObject
    {
        public Metadata metadata { get; set; }
        public List<Location> results { get; set; }
    }
    public class Response
    {
        IList<Metadata> metadata;
        IList<Location> results;
    }
    public void RestFactory(string Token, string Endpoint, Dictionary<string, string> Params)
    {
        // Initiate the REST request
        var client = new RestClient("https://www.ncdc.noaa.gov/cdo-web/api/v2/" + Endpoint);
        var request = new RestRequest(Method.GET);

        // Add the token
        request.AddHeader("token", Token);

        // Add the parameters
        foreach (KeyValuePair<string, string> entry in Params)
        {
            request.AddParameter(entry.Key, entry.Value);
        }

        // Execute the REST request
        var response = client.Execute(request);

        // Deserialize the response
        Response noaa = new JsonDeserializer().Deserialize<Response>(response);

        // Print to console
        foreach (Location loc in noaa)
        {
            Console.WriteLine(loc.name);
        }
    }
}

此时,我只是尝试打印位置名称以达到我的下一个学习里程碑。我收到了错误:

Severity    Code    Description Project File    Line    Suppression State
Error   CS1579  foreach statement cannot operate on variables of type 'NOAA.Response' because    'NOAA.Response' does not contain a public instance definition for 'GetEnumerator'

除了错误之外,我认为我不太了解正确的方法,因为响应有多个“层”。指导?

【问题讨论】:

  • 你需要反序列化为RootObject,而不是Response
  • @Crowcoder 哈哈,你比我快 15 秒!但是您还需要将循环更改为Location loc in noaa.results
  • 太棒了!将我的反序列化代码修改为 RootObject 并将我的迭代修改为 noaa.results 解决了这个问题。

标签: c# restsharp


【解决方案1】:

您的 foreach 循环试图调用对象本身的迭代器,而不是其中的列表。

试试这个


        foreach (Location loc in noaa.results)
        {
            Console.WriteLine(loc.name);
        }

【讨论】:

  • 谢谢,除了上面 Crowcoder 的回复外,这还帮助解决了我的问题
【解决方案2】:

我可以告诉你错误的原因。那是因为 noaa 是不可迭代的。如果要遍历任何对象,则需要实现 IEnumerable 接口。这就是 noaa 不可迭代的原因。 noaa 不继承此接口或实现它。如果你使用 noaa.results,你会得到同样的错误吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多