WP7与ArrayAdapter等效

时间:2011-11-20 03:23:45

标签: json windows-phone-7

我有一个从WCF服务返回的JSON对象,它返回两个“Article”对象,如下所示:

{"GetArticlesResult":[{"ArticleName":"Mobile Application Development","ArticleText":"Lots of text here."},{"ArticleName":"Super Fast Development Cycle","ArticleText":"Lots more text here."}]}

我可以使用以下代码在消息框中显示它:

MessageBox.Show(e.Result);

我想要做的是在ListBox中显示一个ArticleNames列表,然后我想将它们链接到另一个页面以显示ArticleText,但现在是暂时的。

我的研究表明我需要使用DataContractJsonSerializer,但这就是我被困住的地方,所有的例子似乎都有点复杂。在和Android应用程序中,我只需使用ArrayAdapter来填充内容。我可以在WP7应用程序中做类似的事情吗?

干杯,

麦克

修改

我现在有以下内容,如何在ListBox中显示结果?

MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(e.Result));
DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(Article));

//put ms into a listBox here????....

[DataContract]
    public class Article
    {
        [DataMember()]
        public string Title { get; set; }

        [DataMember()]
        public string Text { get; set; }
    }

2 个答案:

答案 0 :(得分:1)

您需要将列表框的ItemsSource属性设置为数组/列表(如果您要在显示时添加更多项目,则需要ObservableCollection)。如果您使用的是ViewModel,则可以将ItemsSource属性绑定到VM上的ObservableCollection属性,它将自动更新。

您可以使用JSON.NET(比DataContractJsonSerializer更快)将JSON反序列化为强类型对象模型并绑定它,或者您可以使用相同的库将JSON反序列化为{{ 1}}然后从中访问JSON属性。

如果您使用强类型对象模型,则需要实现xyzzer对Article / ArticleList所做的更改,以便正确映射。

答案 1 :(得分:0)

也许List可以帮助您从JSON结构反序列化/表示数组。否则 - 问题太模糊了。您是否在询问如何在ListBox中显示集合?使用ItemsSource绑定...

*编辑

试试这个:

var jsonString = "{\"GetArticlesResult\":[{\"ArticleName\":\"Mobile Application Development\",\"ArticleText\":\"Lots of text here.\"},{\"ArticleName\":\"Super Fast Development Cycle\",\"ArticleText\":\"Lots more text here.\"}]}";
var articles = Deserialize<ArticleList>(jsonString);
Debug.WriteLine(articles.GetArticlesResult.Count);

[DataContract]
public class ArticleList
{
    [DataMember]
    public List<Article> GetArticlesResult { get; set; }
}

[DataContract]
public class Article
{
    [DataMember(Name = "ArticleName")]
    public string ArticleName { get; set; }

    [DataMember(Name = "ArticleText")]
    public string ArticleText { get; set; }
}

public static T Deserialize<T>(string strData) where T : class
{
    DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T));
    byte[] byteArray = Encoding.UTF8.GetBytes(strData);
    MemoryStream memoryStream = new MemoryStream(byteArray);
    T tRet = serializer.ReadObject(memoryStream) as T;
    memoryStream.Dispose();
    return tRet;
}