2016-12-20 67 views
0

無法反序列化當前JSON陣列(例如[1,2,3])轉換成類型 '',因爲類型需要JSON對象(例如{ 「名稱」: 「值」})

「由於類型需要JSON對象(例如{」name「:」value「})才能正確地反序列化,所以無法將當前JSON數組反序列化(例如[1,2,3])爲類型''」錯誤

我查看了大部分類似的問題,但沒有找到我正在尋找的答案,所以我正在問一個新問題。

這裏是我的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

顯示你的'ResponseData'類。 – Equalsk

+1

ResponseData類是什麼樣的?我懷疑它預計天氣對象的格式如'{「id」:500,「main」:「Rain」,「description」:「小雨」,「icon」:「10n」}'。您嘗試解析到天氣對象的方括號表示它正在嘗試讀取對象數組。 –

+0

事實上,在你的這個類的根對象中,你可能需要類似'public List weather {get; set;}'其中'Weather'是一個具有類似'id'和'description'屬性的類。 – Equalsk

回答

2

JSON包含Weather的數組,即使它只有一個條目。這是由方括號表示,見下:

「天氣」:[ { 「ID」:500, 「主」: 「雨」, 「描述」:「小雨」 「圖標」: 「10N」 } ]

您說這是您的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

我的壞,想我只是忘記get/set方法 – Equalsk

+0

OK,已經糾正了類。請再試一次。 – Equalsk

相關問題