РЕДАКТИРОВАТЬ: ДОБАВЛЕН РАБОЧИЙ КОД. Большое спасибо Роману. Он герой! :)

Я пытаюсь десериализовать JSON, и как только я пытаюсь получить доступ к чему-либо еще, кроме «основного», я получаю сообщение об ошибке

Ошибка CS1061 «RootObject» не содержит определения для «облаков», и не удалось найти доступный метод расширения «облака», принимающий первый аргумент типа «RootObject» (вам не хватает директивы использования или ссылки на сборку?)

Это JSON:

http://api.openweathermap.org/data/2.5/forecast?q=Auckland,NZ&APPID=45c3e583468bf450fc17026d6734507e&units=metric

{"cod":"200","message":0,"cnt":40,"list":[{"dt":1577178000,"main":
{"temp":13.68,"feels_like":12.74,"temp_min":13.68,"temp_max":14.66,"pressure"
:1010,"sea_level":1010,"grnd_level":1001,"humidity":87,"temp_kf":-
0.98},"weather":[{"id":800,"main":"Clear","description":"clear 
sky","icon":"01n"}],"clouds":{"all":0},"wind":{"speed":2.04,"deg":227},"sys":
{"pod":"n"},"dt_txt":"2019-12-24 09:00:00"},

enter image description here

Это мой код. Я сделал классы в соответствии со структурой JSON, но мне это не нравится. Кто-нибудь знает, как заставить работать облака, погоду и ветер?

enter image description here

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using Newtonsoft.Json;


namespace ConsoleApp2
{
    public class RootObject
    {
        public List<myWeather> list { get; set; }
    }
    public class myWeather
    {
        public Main main { get; set; }
        public Clouds clouds { get; set; }
        public List<Weather> weather { get; set; }
        public Wind wind { get; set; }
        public string dt_txt { get; set; }
    }
    public class Main
    {
        public float temp { get; set; }
        public float humidity { get; set; }
    }
    public class Clouds
    {
        public float all { get; set; }
    }
    public class Weather
    {
        public string description { get; set; }
    }
    public class Wind
    {
        public float speed { get; set; }
    }
    class Program
    {

        static void Main()
        {

           string[] temps = new string[10];
           string[] humidities = new string[10];
           string[] clouds = new string[10];
           string[] sky = new string[20];
           string[] wind = new string[10];

            while(true)
            {
            using (WebClient client = new WebClient())
                { 
                    Console.WriteLine("ACCESSING jsonWeather ...");
                    client.Proxy = null;
                    string jsonWeather = client.DownloadString("http://api.openweathermap.org/data/2.5/forecast?q=Auckland,NZ&APPID=45c3e583468bf450fc17026d6734507e&units=metric");

                    var myweather = JsonConvert.DeserializeObject<RootObject>(jsonWeather);

                    int i = 0;
                    foreach (var json in myweather.list.Take(9))
                    {
                        i++;
                        temps[i] = json.main.temp.ToString();
                        humidities[i] = json.main.humidity.ToString();
                        //clouds[i] = json.clouds.all.ToString();
                        double windspeed = Math.Round( json.wind.speed * 3.6,2);
                        wind[i] = windspeed.ToString();
                        sky[i] = json.weather.First().description.ToString();
                    }

                    Console.WriteLine("Current weather: " + sky[1] + " " + temps[1] + "°C " + wind[1] + "Km/h " + humidities[1] + "% " +
                                      "Forecast 3h: "     + sky[2] + " " + temps[2] + "°C " + wind[2] + "Km/h " + humidities[2] + "% " +
                                      "Forecast 6h: "     + sky[3] + " " + temps[3] + "°C " + wind[3] + "Km/h " + humidities[3] + "% " +
                                      "Forecast 9h: "     + sky[4] + " " + temps[4] + "°C " + wind[4] + "Km/h " + humidities[4] + "% " +
                                      "Forecast 12h: "    + sky[5] + " " + temps[5] + "°C " + wind[5] + "Km/h " + humidities[5] + "% " +
                                      "Forecast 15h: "    + sky[6] + " " + temps[6] + "°C " + wind[6] + "Km/h " + humidities[6] + "% " +
                                      "Forecast 18h: "    + sky[7] + " " + temps[7] + "°C " + wind[7] + "Km/h " + humidities[7] + "% " +
                                      "Forecast 21h: "    + sky[8] + " " + temps[8] + "°C " + wind[8] + "Km/h " + humidities[8] + "% " +
                                      "Forecast 24h: "    + sky[9] + " " + temps[9] + "°C " + wind[9] + "Km/h " + humidities[9] + "% " );
                }
            Task.Delay(600000);
            }
        }
    }
}
1
nolimits 24 Дек 2019 в 09:46
2
Предоставьте ввод Json, не предоставляйте его в виде снимка экрана.
 – 
Sushant Yelpale
24 Дек 2019 в 09:50
1
Это не JSON... это представление JSON в пользовательском интерфейсе. Нам нужен фактический JSON
 – 
Jonathan Alfaro
24 Дек 2019 в 09:51
Большое спасибо. Я добавил необработанные данные JSON
 – 
nolimits
24 Дек 2019 в 09:54
1
Вы обращаетесь к main в цикле через элементы myWeather в myweather.list.Take(3), пытаясь получить доступ к облакам прямо из RootObject. Возможно, myweather — не лучшее имя для десериализованного RootObject, возможно, вам следует просто назвать его rootobject для ясности.
 – 
Joachim Isaksson
24 Дек 2019 в 09:57
Он отлично работает только для основного - когда я удаляю классы для Облаков, Погоды и Ветра. Но я не знаю почему. Как ни странно, я могу уйти в публичные облака { get; установлен; } но добавление общедоступной погоды { get; установлен; } выдает ошибку при запуске программы.
 – 
nolimits
24 Дек 2019 в 10:09

1 ответ

Вы пытаетесь получить доступ к myweather.clouds, но в myweather нет такого свойства. Свойство clouds скрыто под list, поэтому оно должно быть не меньше myweather.list.First().clouds.

2
Roman.Pavelko 24 Дек 2019 в 09:53
Это устранило эту проблему, но затем компилятор сообщает мне: «Невозможно десериализовать текущий массив JSON (например, [1,2,3]) в тип« ConsoleApp2.Weather », потому что для этого типа требуется объект JSON (например, {"name":"value "}) для правильной десериализации."
 – 
nolimits
24 Дек 2019 в 10:00
1
Взгляните на погоду, согласно json - это объект, который содержит массив объектов, но в вашем коде С# это просто класс с одним свойством.
 – 
Roman.Pavelko
24 Дек 2019 в 10:02
1
Измените классы myWeather и Weather на следующие: public class myWeather { public Main main { get; установлен; } облака общедоступных облаков { получить; установлен; } public List погода { get; установлен; } общественный Ветер ветер { получить; установлен; } общедоступная строка dt_txt { получить; установлен; } } публичный класс Weather {public int id {get; установлен; } общедоступная строка main { получить; установлен; } общедоступное строковое описание { get; установлен; } общедоступный значок строки{ получить; установлен; } }
 – 
Roman.Pavelko
24 Дек 2019 в 10:10
1
Это потому, что это должен быть массив погоды, а не один объект. Используйте код из предыдущего комментария, он должен помочь.
 – 
Roman.Pavelko
24 Дек 2019 в 10:19
1
Я думаю, это из этой строки cloud[k] = jsonc.weather.description.ToString(); Вы снова пытаетесь получить доступ к несуществующему свойству. Погода теперь представляет собой список, поэтому вы должны получить доступ к элементу этого списка и только затем к описанию. то есть jsonc.weather.First().description.ToString();
 – 
Roman.Pavelko
24 Дек 2019 в 10:46