如何在Windows Phone 8中解析Json数据

3

我是一个新手,正在学习Windows Phone 8开发。我正在开发一个应用程序,需要解析Json数据。但是在Windows Phone 8上无法获取以下数据。

 {
   "response":{
      "errorFlag":0,
      "Score Detail":{
         "39":[
            {
               "test_date":"2013-06-28",
               "total_marks":"50",
               "score":"14"
            },
            {
               "test_date":"2013-08-08",
               "total_marks":"20",
               "score":"20"
            }
         ],
         "40":[
            {
               "test_date":"2013-08-08",
               "total_marks":"20",
               "score":"20"
            },
            {
               "test_date":"2013-08-08",
               "total_marks":"30",
               "score":"20"
            },
            {
               "test_date":"2013-08-08",
               "total_marks":"30",
               "score":"20"
            }
         ],
         "50":[
            {
               "test_date":"2013-08-08",
               "total_marks":"30",
               "score":"20"
            }
         ]
      }
   }
}

我正在尝试以以下方式解析数据。
namespace testscore
{
public partial class MainPage : PhoneApplicationPage
{
public MainPage()
    {
        InitializeComponent();
        Loaded += new RoutedEventHandler(Mainpage_Loaded);
    }
 void Mainpage_Loaded(object sender, RoutedEventArgs e)
    {
        WebClient webClient1 = new WebClient();
        webClient1.DownloadStringCompleted += new DownloadStringCompletedEventHandler(webClient1_DownloadStringCompleted);
        webClient1.DownloadStringAsync(new Uri("some link"));
    }

public void webClient1_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
    {
        var rootObject = JsonConvert.DeserializeObject<RootObject>(e.Result);
        MessageBox.Show(e.Result.ToString());
        foreach (var res in rootObject.response.ScoreDetail)
        {
            string rs = res.Key;
            MessageBox.Show(rs.ToString());

            ......
        }                                          
    }

public class RootObject
    {
        public Response response { get; set; }
    }

    public class Response
    {
        public int errorFlag { get; set; }
        [JsonProperty("Score Detail")]
        public JObject ScoreDetail { get; set; }           
    }

我现在已经获取到键值(这里是39),但我无法获取评分、测试日期和分数的值。请帮助我解析这些细节。

提前致谢。


“39”属性名称可以更改吗? - Joffrey Kern
不,这里我只需要获取特定(39)号码的数据。 - user2663418
2个回答

6
我建议您构建JSON的类:

我建议您为您的JSON构建类:

public class RootObject
{
    public Response response { get; set; }
}

public class Response
{
    public int errorFlag { get; set; }
    [JsonProperty("Score Detail")]
    public JObject ScoreDetail { get; set; }
}

您可以在DownloadStringCompleted事件上使用它们:
public void webClient1_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
{
    RootObject root = JsonConvert.DeserializeObject<RootObject>(e.Result);
    JObject obj = root.response.ScoreDetail;
    foreach (KeyValuePair<string, JToken> pair in obj)
    {   
        string key = pair.Key; // here you got 39.
        foreach (JObject detail in pair.Value as JArray)
        {
            string date = detail["test_date"].ToString();
            string score = detail["score"].ToString();
            string total_marks = detail["total_marks"].ToString();
        }
    }
}

希望这有所帮助!

这是正确的,但是您已经硬编码了“39”,而它是一个数组,因此将具有多个值。它也可能是“40”或“50”。它是动态的。如何做到这一点? - user2663418
这就是为什么我问你是否有其他的“39”属性...我更新了我的答案。 - Joffrey Kern

0
var result= JObject.Parse(response)["response"]["ScoreDetail"];
                                    foreach (var item in result)
                                    {

// Code to store the result
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接