从windows phone中的webservice读取一个json文件

时间:2012-12-22 16:14:34

标签: c# json windows-phone-7 data-binding

我是Windows Phone应用程序的新手。我有一个JSON文件,我可以从以下URL获得。

http://www.krcgenk.be/mobile/json/request/news/

现在我希望标题显示在我的Windows Phone上的列表中。我有以下XAML。

<Grid>
    <ListBox x:Name="News" Height="532">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal">
                   <TextBlock Text="{Binding Title}" Margin="0,0,12,0" />
                    <TextBlock Text="{Binding Description}"/>
                </StackPanel>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
</Grid>

现在我需要知道如何将标题和描述放入我的列表中。 经过一些谷歌工作,我发现我应该使用JSON.net框架。这给了我以下代码。

var w = new WebClient();

Observable
  .FromEvent<DownloadStringCompletedEventArgs>(w, "DownloadStringCompleted")
  .Subscribe(r =>
  {
      var deserialized =
        JsonConvert.DeserializeObject<List<News>>(r.EventArgs.Result);
      PhoneList.ItemsSource = deserialized;
  });
w.DownloadStringAsync(
  new Uri("http://www.krcgenk.be/mobile/json/request/news/"));

我还创建了一个包含getter和setter的新闻类。 但是当我建立并运行时。我收到以下错误。

Cannot deserialize the current JSON object (e.g. {"name":"value"}) into 
type 'System.Collections.Generic.List`1[KrcGenk.Classes.News]' because the 
type requires a JSON array (e.g. [1,2,3]) to deserialize correctly.

To fix this error either change the JSON to a JSON array (e.g. [1,2,3]) 
or change the deserialized type so that it is a normal .NET type (e.g. not 
a primitive type like integer, not a collection type like an array or 
List<T>) that can be deserialized from a JSON object. JsonObjectAttribute 
can also be added to the type to force it to deserialize from a JSON object.

Path 'news', line 1, position 8.

希望有人能帮帮我吗?

2 个答案:

答案 0 :(得分:0)

答案 1 :(得分:0)

url返回一个对象(这是错误消息所说的)。所以你不应该将它反序列化为一个列表。反序列化应如下所示:

var deserialized =
                JsonConvert.DeserializeObject<NewsEntry>(r.EventArgs.Result);

NewsEntry应包含新闻列表

class NewsEntry {
    public List<News> News { get; set; }
    public NewsEntry() {
        News = new List<News>();
    }
}

注意:我假设News类具有所有属性。也许你需要调整这个。