C# JSON无法反序列化Xamarin天气应用程序

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

我正在学习如何在Xamarin做列表,我昨天就开始了,我有一项工作要在接下来的几天内完成。我的第一个应用程序运行得很好,但第二个应用程序(主要基于第一个应用程序,我上了一节1:30小时的课,没有学到多少东西),当我在Android上运行我的新程序时,我发现错误,它无法反序列化

我很确定我的错误在MainPage.xaml.cs中

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);