0

誰かがボタンをクリックしたときにJSONファイルを解析しようとしています。これにより、ボタンのコンテンツがJSONのデータに置き換えられます。

現在、データがnullのままであるという問題に直面しています。コードは次のとおりです。

private void Button1_Tap(object sender, System.Windows.Input.GestureEventArgs e)
    {
        Button1.FontSize = 15;
        Button1.Content = "Fetching...";
        var client = new WebClient();
        client.OpenReadCompleted +=
            (s, eargs) =>
            {
                var serializer = new DataContractJsonSerializer(typeof(RadioRootObject));
                if (eargs.Error != null)
                {
                    if (eargs.Error.Message.Contains("NotFound"))
                    {
                        MessageBox.Show("Could not retrieve playlist", "Error", MessageBoxButton.OK);
                        Button1.Content = "Could not retrieve playlist";
                    }
                    else
                    {
                        MessageBox.Show("Could not retrieve playlist", "Error", MessageBoxButton.OK);
                        Button1.Content = "Could not retrieve playlist";
                    }
                }
                else
                {
                    var root = (RadioRootObject)serializer.ReadObject(eargs.Result);
                    var songHistory = root.station3;
                    Button1.Content = songHistory.text;
                }
            };
        var uri = new Uri("http://www.reignofcomputer.com/tmpsend/nowplaying.json");
        client.OpenReadAsync(uri);
    }

    public class station1
    {
        public string station { get; set; }
        public string title { get; set; }
        public string artist { get; set; }
        public string text { get; set; }
    }

    public class station2
    {
        public string station { get; set; }
        public int listeners { get; set; }
        public string title { get; set; }
        public string artist { get; set; }
        public string text { get; set; }
    }

    public class station3
    {
        public string station { get; set; }
        public int listeners { get; set; }
        public string title { get; set; }
        public string artist { get; set; }
        public string text { get; set; }
    }

    public class RadioRootObject
    {
        public station1 station1 { get; set; }
        public station2 station2 { get; set; }
        public station3 station3 { get; set; }
    }

rootnullのsongHistoryままであるため、NullReferenceExceptionがスローされます。

station1およびは、およびstation2で使用されますが、上記のコードには示されていません。これらは上記と同様です。Button2_TapButton3_TapButton1_Tap

DataContractJsonSerializerは、jsonオブジェクトからRadioRootObjectクラスのプロパティstation1へのプロパティ "1"を一致させることができないと言われていますが、どのように一致させるかはわかりません。

JSON自体のデータを変更できません。何か案は?

4

2 に答える 2

2

Windows PhoneアプリケーションでJSONを解析する方法については、このブログ投稿を確認してください

したがって、これを試してください

private void Button_Click(object sender, RoutedEventArgs e)
    {
        Button1.FontSize = 15;
        Button1.Content = "Fetching...";var client = new WebClient();
        var uri = new Uri("http://www.reignofcomputer.com/tmpsend/nowplaying.json");
        client.DownloadStringCompleted += new DownloadStringCompletedEventHandler(client_DownloadStringCompleted);
        client.DownloadStringAsync(uri);
    }

void client_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
    {
        var jobj = JObject.Parse(e.Result);
        var station3 = jobj["3"];
        Button1.Content = station3["text"];
    }
于 2013-01-08T08:28:12.780 に答える
1

JSONのプロパティは「1」であり、RadioRootObjectのメンバーの名前は「station1」であるため、これらは一致しません。DataMemberAttributeを使用して、JSONの名前をシリアライザーに伝えることができます。

public class RadioRootObject
{
    [DataMember(Name="1")]
    public station1 station1 { get; set; }
    [DataMember(Name="2")]
    public station2 station2 { get; set; }
    [DataMember(Name="3")]
    public station3 station3 { get; set; }
}

正直なところ、クラスとメンバーには[DataContract]属性と[DataMember]属性が必要だと思いましたが(DataContractJsonSerializerの例を参照)、間違っている可能性があります:-)

于 2013-01-08T07:35:35.740 に答える