我一直在关注使用API密钥的UWP Weather应用程序的教程。
我得到System.NullReferenceException
。
这是它在以RootObject
:
namespace UWP_Weather_App
{
public sealed partial class MainPage : Page
{
public MainPage()
{
this.InitializeComponent();
}
private async void Button_Click(object sender, RoutedEventArgs e)
{
RootObject myWeather = await OpenWeatherMapProxy.GetWeather(20.0, 30.0);
ResultTextBlock.Text = myWeather.name + " - " + myWeather.main.temp + " - " + myWeather.weather[0].description;
}
}
}
答案 0 :(得分:0)
根据您的说明,我假设您正在关注此UWP Weather tutorial。我在本教程source code中使用了您的代码并重现了您的问题。
System.NullReferenceException
行发生ResultTextBlock.Text = myWeather.name + " - " + myWeather.main.temp + " - " + myWeather.weather[0].description;
错误
这是因为您在GetWeather
方法中使用的网址不对。此网址返回的结果不包含天气信息,当它反序列化为RootObject
时,大多数属性都将为空。
要按地理坐标检索当前天气数据,我们可以使用以下API:
api.openweathermap.org/data/2.5/weather?lat={lat}&lon={lon}
从2015年10月9日开始,此API需要有效的APPID才能访问。有关详细信息,请参阅Call current weather data for one location和How to use API key in API call。
因此,我们可以更改GetWeather
方法,如下所示来修复此错误。
public async static Task<RootObject> GetWeather(double lat, double lon)
{
var http = new HttpClient();
var response = await http.GetAsync($"http://api.openweathermap.org/data/2.5/weather?lat={lat}&lon={lon}&appid={APIKEY}&units=metric");
var result = await response.Content.ReadAsStringAsync();
var data = JsonConvert.DeserializeObject<RootObject>(result);
return data;
}
请注意,我尝试使用您的API密钥,但我遇到401 Invalid API key
错误,因此请确保您使用正确的密钥。另外,我们需要将Main.pressure
和Wind.deg
的类型更改为double
,因为它们的值不是int
。如果我们不改变类型,我们可能会在反序列化时获得Newtonsoft.Json.JsonReaderException
。