2017-04-26 9 views
0

ObservableCollectionにシンプルjsonをデシリアライズしようとしています。 Deserializationのブレークポイントを設定すると、何も起きないようです。メソッドは決して完了せず、エラーをスローしません。 jsonを取得して文字列に変換できます。ObservableCollectionにデシリアライズしないでください。jsonをObservableCollectionにデシリアライズしてXamarin.Formsのxamlにバインドできません

何か不足していますか?私はオブジェクトにデシリアライズするために見つけることができるすべてのコード例を見てきましたが、それを機能させるように見えません。

これは私の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; } 
    } 
} 

これは私の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> 

これは素晴らしいだろう理解するすべてのヘルプ。

+1

json配列[]がオブジェクト{}内に含まれているため、jsonとデシリアライズしようとしているものとの間に不一致があります。あなたはどちらか一方を修正して、両方が一致するようにする必要があります。 – Jason

+0

ありがとう、ジェイソン。私は構造を変更し、問題なくデシリアライズしてバインドすることができました。私はこれを理解しようと数週間過ごしたので、ありがとう。 – PeterG

答えて

0

alertsは、ルートオブジェクトの下にネストされているため、直接的に逆シリアル化できません。

しかし、あなたはこれを試すことができます。

JObject.Parse(content) 
    .SelectToken("alerts") 
    .ToObject<ObservableCollection<Alert>>(); 

これは、あなたが問題を理解するのに役立つ必要があります。 enter image description here

あなたが持っているJSONはRootObjectWithNestedNumberListのようですが、デシリアライズしようとしていましたそれはSimpleNumberListとしてそれです。明らかに、それはうまくいきませんでした。

+0

これはどういう意味なのか分かりませんが、私はとても興味があります。これについて文書がどこにあるのか分かりますか? – PeterG

+0

それはジェンソンの一般的な理解の多くです。私はあなた[ここ](http://stackoverflow.com/documentation/json/topics)を送ることができますが、それは本当に助けにはなりません。 – Xiaoy312

+0

これは私がお勧めするのと基本的に同じものです - それはジェネリックjsonコンテナにデータを解析し、配列だけを抽出してから逆シリアル化します。 – Jason

関連する問題