Как получить доступ к значению в словаре, которое заключено в список в файле json - PullRequest
0 голосов
/ 30 апреля 2020

Вопрос может показаться немного запутанным, но я просто пытаюсь получить доступ к элементу внутри словаря. Словарь был изначально заключен в список, ключом которого была строка 'main'. Этот 'main' является частью json файла в этом формате:

        {"coord":{"lon":151.21,"lat":-33.87},
        "weather":[{"id":803,"main":"Clouds","description":"broken clouds","icon":"04n"}],
        "base":"stations",
        "main":{"temp":291.97,"feels_like":290.16,"temp_min":290.93,"temp_max":293.15,"pressure":1016,"humidity":56},
        "visibility":10000,
        "wind":{"speed":2.6,"deg":250},
        "clouds":{"all":83},
        "dt":1587639926,
        "sys":{"type":1,"id":9600,"country":"AU","sunrise":1587587012,"sunset":1587626585},
        "timezone":36000,"id":2147714,"name":"Sydney","cod":200}

Это класс, в который я анализирую файл json, помещая каждую часть файла json в отдельные классы или строки.

public class coord
        {
            public double lon { get; set; }
            public double lat { get; set; }
        }

        public class weather
        {
            public int id { get; set; }
            public string main { get; set; }
            public string description { get; set; }
            public string icon { get; set; }
        }

        public class main
        {
            public double temp { get; set; }
            public double temp_min {get; set;}
            public double temp_max { get; set; }
            public int pressure { get; set; }
            public int humidity { get; set; }
        }

        public class wind
        {
            public double speed { get; set; }
        }

        public class sys
        {
            public string country { get; set; }
        }

        public class Root
        {
            public coord coord { get; set; }
            public List<weather> weather { get; set; }
            public main main { get; set; }
            public wind wind { get; set; }
            public sys sys { get; set; }
            public string country {get; set;}
            public string name { get; set; }


        }
}

Это код, в котором я пытаюсь получить доступ к значению 'icon' в разделе 'main' , но это дает мне ошибку : Невозможно применить индексирование с помощью [] к выражению типа 'WeatherModel.Weather' :

public static (string, string, double, string) LoadWeather(string city_a)
        {
            int cityId = obtain_Id(city_a);
            if (cityId != 0)
            {
                using (WebClient web = new WebClient())
                {
                    string json = new WebClient().DownloadString($"https://api.openweathermap.org/data/2.5/weather?id={cityId}&appid=67f9bc5970b49b875ccecec84f849300");


                    var items = JsonConvert.DeserializeObject<WeatherModel.Root>(json);
                    //Trying to acquire the icon from the weather list

                    string icon = items.weather[0]["icon"];
                    string url = $"http://openweathermap.org/img/wn/{icon}@2x.png";
                    string city = string.Format($"{items.name}");
                    string country = string.Format($"{items.sys.country}");
                    double temp = items.main.temp - 276;

                    //city = cityName;
                    //country = countryName;
                    //temp = temperature;
                    return (city, country, temp, url);
                }
            }
            else
            {
                return ("0", "0", 0.0, "0");
            }

        }

Ответы [ 2 ]

1 голос
/ 30 апреля 2020

Когда вы десериализуете объект json в экземпляр Root, каждое поле также десериализуется. Поле "погода" де-факто десериализовано в экземпляре списка, но здесь элементы списка имеют тип "погода", причем "погода" - это класс, который не реализует объект IDictionary. Пункты списка - это не словари, а экземпляры класса weather.

Вы должны попробовать

items.weather[0].icon

1 голос
/ 30 апреля 2020

Вы используете List<weather> коллекцию для хранения десериализованных weather, а погода - это объект, поэтому вы должны получить свойство icon, например:

string icon = items.weather[0].icon;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...