Ajility
Ajility

Reputation: 567

Deserialize RESTSharp JSON Response

I'm working on a project to gather data from NOAA. I'm having trouble figuring out how to make the response usable.

This is what NOAA's API response looks like to my call:

{
    "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"
        }
    ]
}

I used JSON2CSharp.com to convert the result set into my needed classes. Below is the relevant code:

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);
        }
    }
}

At this point, I'm just trying to print the location name to reach my next learning milestone. I'm getting the error:

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'

Other than the error, I think I don't quite understand the proper approach since the response has more than one "layer". Guidance?

Upvotes: 0

Views: 760

Answers (2)

manish bajaj
manish bajaj

Reputation: 54

I can tell you the cause of error. That is because noaa is not iterable. If you want to iterate over any object then it needs to implement IEnumerable interface. This is the reason because of which noaa is not iterable. noaa does not inherit this interface or implement it. Do you get the same error if you use noaa.results?

Upvotes: 2

Matti Price
Matti Price

Reputation: 3551

Your foreach loop is trying to call an iterator on the object itself, not the list inside it.

Try this instead


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

Upvotes: 3

Related Questions