C# JSON无法反序列化Xamarin天气应用程序
我正在学习如何在Xamarin做列表,我昨天就开始了,我有一项工作要在接下来的几天内完成。我的第一个应用程序运行得很好,但第二个应用程序(主要基于第一个应用程序,我上了一节1:30小时的课,没有学到多少东西),当我在Android上运行我的新程序时,我发现错误,它无法反序列化 我很确定我的错误在MainPage.xaml.cs中C# JSON无法反序列化Xamarin天气应用程序,c#,json,xamarin,xamarin.forms,C#,Json,Xamarin,Xamarin.forms,我正在学习如何在Xamarin做列表,我昨天就开始了,我有一项工作要在接下来的几天内完成。我的第一个应用程序运行得很好,但第二个应用程序(主要基于第一个应用程序,我上了一节1:30小时的课,没有学到多少东西),当我在Android上运行我的新程序时,我发现错误,它无法反序列化 我很确定我的错误在MainPage.xaml.cs中 public partial class MainPage : ContentPage { const string Url = "https://api.ip
public partial class MainPage : ContentPage
{
const string Url = "https://api.ipma.pt/open-data/forecast/meteorology/cities/daily/1110600";
public MainPage()
{
InitializeComponent();
}
protected override void OnAppearing()
{
GetMeteo0();
base.OnAppearing();
}
async void GetMeteo0()
{
List<Meteo0> meteo0;
HttpClient httpClient = new HttpClient();
var content = await httpClient.GetStringAsync(Url);
var result = JsonConvert.DeserializeObject<RootObject>(content);
meteo0ListView.ItemsSource = result.data;
}
private void meteo0ListView_ItemSelected(object sender, SelectedItemChangedEventArgs e)
{
Meteo0 meteo0 = e.SelectedItem as Meteo0;
Navigation.PushAsync(new MeteoDetails(meteo0));
}
}
meteo0.cs(第8至26行)
新RootObject.cs
public class RootObject
{
public string owner { get; set; }
public string country { get; set; }
public string forecastDate { get; set; }
public List<Meteo0> data { get; set; }
public DateTime dataUpdate { get; set; }
}
公共类根对象
{
公共字符串所有者{get;set;}
公共字符串国家{get;set;}
公共字符串预测日期{get;set;}
公共列表数据{get;set;}
公共日期时间数据更新{get;set;}
}
MainPage.xaml
<ListView x:Name="meteo0ListView" ItemSelected="meteo0ListView_ItemSelected">
<ListView.ItemTemplate>
<DataTemplate>
<TextCell Text="Weather"/>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
如果查看从服务器接收到的Json结果,可以看到它实际上不是根目录中的列表。您试图做的是将单个对象强制转换到列表中,即使数据点列表实际上是根对象中的一个属性
{
“所有者”:“IPMA”,
“国家”:“PT”,
“数据”:[
{
“precipitaProb”:“79.0”,
“tMin”:“11.3”,
“tMax”:“17.7”,
“Predwindir”:“SW”,
“idWeatherType”:7,
“类风速”:2,
“经度”:“-9.1286”,
“预测日期”:“2019-02-10”,
“classprecent”:1,
“纬度”:“38.7660”
},
{
“precipitaProb”:“0.0”,
“tMin”:“9.6”,
“tMax”:“17.0”,
“predwindir”:“N”,
“idWeatherType”:1,
“classWindSpeed”:1,
“经度”:“-9.1286”,
“预测日期”:“2019-02-11”,
“纬度”:“38.7660”
}
// ...
],
“全球本地”:1110600,
“数据更新”:“2019-02-10T11:31:03”
}
知道了这一点,您应该有两个类,一个包含数据点列表的主类。大概是这样的:
公共类天气结果{
公共字符串所有者{get;set;}
公共字符串国家{get;set;}
公共列表数据{get;set;}
// ...
}
然后,您应该反序列化到该实体,而不是Meteo0实体的列表
var result = JsonConvert.DeserializeObject<WeatherResult>(content);
var result=JsonConvert.DeserializeObject(内容);
在此之后,您可以通过参考result.data
轻松地将Meteo0对象列表用作项目资源
顺便说一句,正如您从数据中看到的,tMin和tMax字段不是整数类型,因为它们包含十进制值。您还必须修复该问题。实际的错误消息和stacktrace是什么?
这是您的数据绑定吗?如果是的话,你应该使用
你好,谢谢你的帮助,我编辑了我的代码,但是我确定我有些地方出错了,你能看看编辑的文件和新的吗?Thanks@RuiLima看看我答案的最后一部分。您应该将tMin和tMax的类型更改为支持十进制值(float、double、decimal)而不是整数。否则像9.6这样的值的反序列化将失败。完成,但我仍然无法在应用程序上获取值,应用程序工作,我可以选择菜单,但无法获取值。我不确定我是否理解该问题。您的意思是,在将列表绑定到ItemsSource之后,在UI上看不到任何东西吗?如果是这样,您还应该在问题中发布MainPage.xaml。否则,您是否已使用调试器检查结果。数据是否包含任何项目?当我启动应用程序时,我有一个菜单,可以单击,然后我转到suposly向我提供天气信息的页面,该信息不会显示,我将在上面发布mainpage.xaml
public class RootObject
{
public string owner { get; set; }
public string country { get; set; }
public string forecastDate { get; set; }
public List<Meteo0> data { get; set; }
public DateTime dataUpdate { get; set; }
}
<ListView x:Name="meteo0ListView" ItemSelected="meteo0ListView_ItemSelected">
<ListView.ItemTemplate>
<DataTemplate>
<TextCell Text="Weather"/>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
var result = JsonConvert.DeserializeObject<WeatherResult>(content);