WP7 JSON返回列表中的列表

时间:2012-02-06 05:33:52

标签: c# json windows-phone-7 json.net

我正在尝试从列表中的列表中返回json数据。使用webclient提取数据并使用JSON.NET进行反序列化。我想从“结果”列表中的“featuredCharts”列表中返回一个名称和图像。这是我所指的json数据的一部分。

"results":{
  "featuredCharts":[
     {
        "id":46082,
        "type":"chart",
        "name":"Exclusives On Beatport - Week 5",
        "slug":"exclusives-on-beatport-week-5",
        "description":"",
        "publishDate":"2012-01-30",
        "price":{
           "code":"usd",
           "symbol":"$",
           "value":2390
        },
        "audioFormatFee":{
           "wav":{
              "code":"usd",
              "symbol":"$",
              "value":1000
           },
           "aiff":{
              "code":"usd",
              "symbol":"$",
              "value":1000
           }
        },
        "genres":[
           {
              "id":11,
              "name":"Tech House",
              "slug":"tech-house",
              "type":"genre"
           },
           {
              "id":5,
              "name":"House",
              "slug":"house",
              "type":"genre"
           },
           {
              "id":17,
              "name":"Electro House",
              "slug":"electro-house",
              "type":"genre"
           },
           {
              "id":15,
              "name":"Progressive House",
              "slug":"progressive-house",
              "type":"genre"
           }
        ],
        "images":{
           "small":{
              "width":30,
              "height":30,
              "url":"http:\/\/geo-media.beatport.com\/items\/imageCatalog\/4000000\/900000\/50000\/1000\/200\/40\/4951247.jpg",
              "secureUrl":"https:\/\/media.beatport.com\/items\/imageCatalog\/4000000\/900000\/50000\/1000\/200\/40\/4951247.jpg"
           },
           "medium":{
              "width":60,
              "height":60,
              "url":"http:\/\/geo-media.beatport.com\/items\/imageCatalog\/4000000\/900000\/50000\/1000\/200\/40\/4951248.jpg",
              "secureUrl":"https:\/\/media.beatport.com\/items\/imageCatalog\/4000000\/900000\/50000\/1000\/200\/40\/4951248.jpg"
           },
           "large":{
              "width":130,
              "height":130,
              "url":"http:\/\/geo-media.beatport.com\/items\/imageCatalog\/4000000\/900000\/50000\/1000\/200\/40\/4951249.jpg",
              "secureUrl":"https:\/\/media.beatport.com\/items\/imageCatalog\/4000000\/900000\/50000\/1000\/200\/40\/4951249.jpg"
           },
           "xlarge":{
              "width":500,
              "height":500,
              "url":"http:\/\/geo-media.beatport.com\/items\/imageCatalog\/4000000\/900000\/50000\/1000\/200\/50\/4951250.jpg",
              "secureUrl":"https:\/\/media.beatport.com\/items\/imageCatalog\/4000000\/900000\/50000\/1000\/200\/50\/4951250.jpg"
           }
        },
        "chartOwner":null
     },

我的课目前设置如下。

public class NewReleasesCharts //Root Object
{
    public Metadata metadata { get; set; }
    public List<ResultHome> results = new List<ResultHome>();

    public IEnumerator<ResultHome> GetEnumerator()
    {
        return this.results.GetEnumerator();
    }
}

public class ResultHome
{
    public List<FeaturedCharts> featuredCharts { get; set; }
    public List<FeaturedReleases> featuredReleases { get; set; }
}

public class FeaturedCharts
{
    public int id { get; set; }
    public string type { get; set; }
    public string name { get; set; }
    public string slug { get; set; }
    public ChartImages chartImages { get; set; }
}

public class ChartImages
{
    public ChartSmall chartSmall { get; set; }
    public ChartMedium chartMedium { get; set; }
    public ChartLarge chartLarge { get; set; }
}

public class ChartMedium
{
    public int width { get; set; }
    public int height { get; set; }
    public string url { get; set; }
    public string secureUrl { get; set; }
}

这是我坚持的部分。在反序列化数据后,我考虑使用嵌套的foreach循环,但我目前收到错误“无法将类型Beatport.Classes.ResultHome转换为'Beatport.Classes.FeaturedCharts”。这是代码。

UPDATE 我根据ColinE的答案更新了我的代码,现在我在内部foreach循环上收到NullReferenceException错误。

    // Deserialize home page data
    void jsonHome_GetDataCompleted(object snder, DownloadStringCompletedEventArgs e)
    {
        try
        {
            NewReleasesCharts homeData = JsonConvert.DeserializeObject<NewReleasesCharts>(e.Result);

            try
            {
                // Nested foreach loops to dispaly data
                foreach (ResultHome rc in homeData)
                {
                    try
                    {
                        foreach (FeaturedCharts fc in rc.featuredCharts)
                        {
                            // TODO: return name and image of chart
                            string name = fc.name;
                            listCharts.Items.Add(name);
                        }
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message);
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }

当谈到c#时,我仍然是初学者,所以我不确定嵌套的foreach循环是否是正确的方法。如何正确执行此操作的示例将为我提供一些内容,因为我需要在我的应用程序的其他部分执行此操作。

感谢。

1 个答案:

答案 0 :(得分:0)

你的第二个for循环正在迭代与第一个相同的数据。您需要迭代外部循环中迭代的变量的featuredCharts属性:

    try
    {
        NewReleasesCharts homeData = JsonConvert.DeserializeObject<NewReleasesCharts>(e.Result);

        // foreach loop to dispaly data
        foreach (ResultHome rc in homeData)
        {
            foreach (FeaturedCharts fc in rc.featuredCharts)
            {
                // return name and image of chart
            }
        }
    }

要解决此功能中的此类问题,请尝试在代码中设置断点并在调试模式下运行。然后,您可以检查每个变量的类型,以确定您做错了什么。