C# 无法将json反序列化为ObservableCollection并绑定到Xamarin.Forms中的xaml

C# 无法将json反序列化为ObservableCollection并绑定到Xamarin.Forms中的xaml,c#,json,xaml,xamarin.forms,json-deserialization,C#,Json,Xaml,Xamarin.forms,Json Deserialization,我正在尝试将简单的json反序列化为ObservableCollection。当我为反序列化设置断点时,似乎什么都没有发生。该方法永远不会完成,也不会抛出错误。我能够获取json并转换为字符串,只是不能反序列化为ObservableCollection 我错过什么了吗?我已经看过了我能找到的每一个反序列化到对象的代码示例,但似乎无法使其工作 这是我的Xamarin.Forms页面的代码 public partial class Notification : ContentPage { p

我正在尝试将简单的json反序列化为ObservableCollection。当我为反序列化设置断点时,似乎什么都没有发生。该方法永远不会完成,也不会抛出错误。我能够获取json并转换为字符串,只是不能反序列化为ObservableCollection

我错过什么了吗?我已经看过了我能找到的每一个反序列化到对象的代码示例,但似乎无法使其工作

这是我的Xamarin.Forms页面的代码

public partial class Notification : ContentPage
{
    public Notification()
    {
        InitializeComponent();
        this.BindingContext = NotificationData();
    }

    public async Task NotificationData()
    {
        ObservableCollection<Alert> notification = await GetAlert();
        NotificationList.ItemsSource = notification;
    }
    public static async Task<ObservableCollection<Alert>> GetAlert()
    {
        string WPPosts = "https://www.url.com/alerts.json";
        HttpClient client = new HttpClient();
        var response = await client.GetAsync(WPPosts).ConfigureAwait(false);

        if (response != null)
        {
            ObservableCollection<Alert> data = new ObservableCollection<Alert>();
            string content = response.Content.ReadAsStringAsync().Result;
            //string content_sanitized = RemoveHTMLTags(content);
            data = JsonConvert.DeserializeObject<ObservableCollection<Alert>>(content);
            return data;
        }
        else { return null; }
    }
    public class Alert
    {
        public string title { get; set; }
        public string imgUrl { get; set; }
        public string content { get; set; }
    }

    public class RootObject
    {
        public List<Alert> alerts { get; set; }
    }
}
公共部分类通知:ContentPage
{
公告()
{
初始化组件();
this.BindingContext=NotificationData();
}
公共异步任务NotificationData()
{
ObservableCollection notification=等待GetAlert();
NotificationList.ItemsSource=通知;
}
公共静态异步任务GetAlert()
{
字符串WPPosts=”https://www.url.com/alerts.json";
HttpClient=新的HttpClient();
var response=await client.GetAsync(WPPosts).ConfigureAwait(false);
if(响应!=null)
{
ObservableCollection数据=新的ObservableCollection();
字符串内容=response.content.ReadAsStringAsync().Result;
//字符串内容\u已消毒=移除HTMLTAGS(内容);
data=JsonConvert.DeserializeObject(内容);
返回数据;
}
else{return null;}
}
公共类警报
{
公共字符串标题{get;set;}
公共字符串imgUrl{get;set;}
公共字符串内容{get;set;}
}
公共类根对象
{
公共列表警报{get;set;}
}
}
这是我的Xaml

<?xml version="1.0" encoding="UTF-8"?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" Title="News 
and Alerts" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
x:Class="JenksTrash.Notification" xmlns:local="clr-
namespace:JenksTrash" >
<ListView x:Name="NotificationList">
    <ListView.ItemTemplate>
        <DataTemplate>
            <ViewCell>
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="1" />
                        <ColumnDefinition Width="7*" />
                    </Grid.ColumnDefinitions>
                        <Label Text="{Binding title}" FontAttributes="Bold" />
                        <Label Text="{Binding content}" FontAttributes="Bold" />
                    </Grid>
            </ViewCell>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>


理解这一点的任何帮助都将是惊人的。

警报嵌套在根对象下,因此不能直接反序列化它

但是,您可以尝试以下方法:

JObject.Parse(content)
    .SelectToken("alerts")
    .ToObject<ObservableCollection<Alert>>();
JObject.Parse(内容)
.SelectToken(“警报”)

.ToObject您的json数组[]包含在对象{}中,因此您的json与您尝试反序列化的对象之间存在不匹配。你需要修正一个或另一个,这样它们才能匹配。谢谢你,杰森。我改变了结构,能够毫无问题地反序列化和绑定。我花了几个星期的时间试图弄明白这一点,谢谢。我真的不明白这意味着什么,但我很感兴趣。你知道这方面的文档在哪里吗?这基本上和我推荐的一样——它将数据解析成一个通用的json容器,只提取数组,然后反序列化它