我有一个从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; }
}
答案 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;
}