2016-12-20 2 views
0

Я получилНе может десериализации текущего массива JSON (например, [1,2,3]) в тип «», так как тип требует объекта JSON (например, { «имя»: «значение»})

«Невозможно десериализовать текущий массив JSON (например, [1,2,3]) в тип« », потому что для типа требуется объект JSON (например,« имя »:« значение »}) для десериализации правильно». Ошибка

Я просмотрел большинство подобных вопросов, но не нашел ответа на то, что искал, поэтому я прошу нового.

Вот мой JSON:

{ 
    "coord": { 
     "lon": 105.84, 
     "lat": 21.59 
    }, 
    "weather": [ 
     { 
      "id": 500, 
      "main": "Rain", 
      "description": "light rain", 
      "icon": "10n" 
     } 
    ], 
    "base": "stations", 
    "main": { 
     "temp": 20.31, 
     "pressure": 1010.36, 
     "humidity": 98, 
     "temp_min": 20.31, 
     "temp_max": 20.31, 
     "sea_level": 1026.71, 
     "grnd_level": 1010.36 
    }, 
    "wind": { 
     "speed": 1.86, 
     "deg": 124.5 
    }, 
    "rain": { 
     "3h": 0.3075 
    }, 
    "clouds": { 
     "all": 92 
    }, 
    "dt": 1482264413, 
    "sys": { 
     "message": 0.0114, 
     "country": "VN", 
     "sunrise": 1482190209, 
     "sunset": 1482229157 
    }, 
    "id": 1566319, 
    "name": "Thai Nguyen", 
    "cod": 200 
} 

И вот мой код:

private void Form1_Load(object sender, EventArgs e) 
{ 
    string url = "http://api.openweathermap.org/data/2.5/weather?q=London&units=metric&appid={MyAppID}"; 
    HttpWebRequest httpWebRequset = (HttpWebRequest)WebRequest.Create(url); 
    httpWebRequset.Method = WebRequestMethods.Http.Get; 
    httpWebRequset.ContentType = "application/json"; 

    HttpWebResponse httpResponse = (HttpWebResponse)httpWebRequset.GetResponse(); 

    using (var StreamReader = new StreamReader(httpResponse.GetResponseStream())) 
    { 
     string responseString = StreamReader.ReadToEnd(); 

     ResponseData data = JsonConvert.DeserializeObject<ResponseData>(responseString); 

     ShowTemp.Text = data.main.temp + "°C"; 
     ShowWheater.Text = data.weather.description; 
    } 
} 

Если когда-нибудь я стараюсь, чтобы получить температуру я могу найти его, но когда я хочу, чтобы получить описание от:

{ 
    ... 
    "weather": [ 
     { 
      "id": 500, 
      "main": "Rain", 
      "description": "light rain", 
      "icon": "10n" 
     } 
    ] 
    ... 
} 

Я получаю сообщение об ошибке.

+2

Показать свой 'Resp класс onseData'. – Equalsk

+1

Как выглядит класс ResponseData? Я подозреваю, что ожидается, что объект погоды будет отформатирован как «{« id »: 500,« main »:« Rain »,« description »:« light rain »,« icon »:« 10n »}. Квадратные скобки, которые вы пытаетесь проанализировать в погодном объекте, означает, что он пытается читать в массиве объектов. –

+0

Действительно, в вашем корневом объекте для этого класса вам, вероятно, понадобится что-то вроде 'public List weather {get; set;}' где 'Weather' - класс с такими свойствами, как' id' и 'description'. – Equalsk

ответ

2

JSON содержит массив из Weather, даже если он имеет только одну запись. Это обозначается в квадратных скобках, смотрите ниже:

"погода": [ { "Идентификатор": 500, "главный": "Дождь", "Описание": "дождь », "значок": "10н" } ]

Вы сказали, что это был ваш ResponseData класс:

class ResponseData 
{ 
    public Main main; 
    public Weather weather; 
} 

class Main 
{ 
    public string temp; 
} 

class Weather 
{ 
    public string description; 
} 

Изменение ResponseData класс к этому:

public class ResponseData 
{ 
    public Main main { get; set; } 
    public List<Weather> weather { get; set; } // This is a List<T> of Weather 
}            // It can contain more than one entry 
               // for weather 

public class Main 
{ 
    public double temp { get; set; } // This is a double 
} 

public class Weather 
{ 
    public string description { get; set; } 
} 

Вы также должны иметь ссылку на System.Collections добавлены к вашему проекту и соответствующему using:

using System.Collections; 

Поскольку погода теперь список вы должен получить доступ к нему по индексу следующим образом:

ShowWeather.Text = data.weather[0].description; 
+0

Теперь я получаю эту ошибку «Список » не содержит определения для «описания», и не существует метода «описания» метода расширения, допускающего первый аргумент типа «Список » (вам не хватает директивы using или сборка ссылка?) – masperro

+0

Мой плохой, думаю, я просто забыл получить/установить – Equalsk

+0

ОК, исправило класс. Пожалуйста, попробуйте еще раз. – Equalsk

Смежные вопросы

 Смежные вопросы