NullReferenceException с вложенными циклами foreach WP7

Я пытаюсь вернуть данные json из списка в списке. Данные извлекаются с помощью веб-клиента и десериализуются с помощью 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, но в настоящее время я получаю ошибку NullReferenceException на rc.featuredCharts во внутреннем цикле foreach. Вот код.

    // Deserialize home page data
    void jsonHome_GetDataCompleted(object snder, DownloadStringCompletedEventArgs e)
    {
        NewReleasesCharts homeData = JsonConvert.DeserializeObject<NewReleasesCharts>(e.Result);
        try
        {
            // Nested foreach loops to dispaly data
            foreach (ResultHome rc in homeData)
            {
                foreach (FeaturedCharts fc in rc.featuredCharts)
                {
                    // TODO: return name and image of chart
                    string name = fc.name;
                    listGenres.Items.Add(name);
                }
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString());
        }
    }

Я все еще новичок, когда дело доходит до С#, поэтому я не уверен, что делаю неправильно. Пример того, как это сделать правильно, даст мне что-то, на чем можно основываться, так как мне нужно будет сделать это в других частях моего приложения.

Спасибо.

ОБНОВЛЕНИЕ Вот полное исключение:

System.NullReferenceException was unhandled

Message=NullReferenceException StackTrace: at Beatport.MainPage.jsonHome_GetDataCompleted(объект sder, DownloadStringCompletedEventArgs e) в System.Net.WebClient.OnDownloadStringCompleted(DownloadStringCompletedEventArgs e) в System.Net.WebClient.DownloadStringOperationCompleted(Object arg) в System.Reflection.RuntimeMethodInfo.InternalInvoke (RuntimeMethodInfo rtmi, Object obj, BindingFlags invokeAttr, связующее устройство, параметры объекта, язык и региональные параметры CultureInfo, логическое значение isBinderDefault, вызывающий объект сборки, логическое значение verifyAccess, StackCrawlMark и stackMark) в System.Reflection.RuntimeMethodInfo.InternalInvoke(Object obj, BindingFlags invokeAttr, связующее устройство, объект [] параметры, культура CultureInfo, StackCrawlMark и stackMark) в System.Reflection.MethodBase.Invoke(Object obj, параметры Object[]) в System.Delegate.DynamicInvokeOne(Object[] args) в System.MulticastDelegate.DynamicInvokeImpl(Object[] args ) в System.Delegate.D ynamicInvoke(аргументы Object[]) в System.Windows.Threading.DispatcherOperation.Invoke() в System.Windows.Threading.Dispatcher.Dispatch(приоритет DispatcherPriority) в System.Windows.Threading.Dispatcher.OnInvoke(контекст объекта) в System. Windows.Hosting.CallbackCookie.Invoke(аргументы Object[]) в System.Windows.Hosting.DelegateWrapper.InternalInvoke(аргументы Object[]) в System.Windows.RuntimeHost.ManagedHost.InvokeDelegate(IntPtr pHandle, Int32 nParamCount, ScriptParam[] pParams , ScriptParam& pResult)


person nos9    schedule 16.02.2012    source источник
comment
возможный дубликат Что такое NullReferenceException в .NET?   -  person John Saunders    schedule 16.02.2012
comment
Кроме того, я предлагаю вам избавиться от привычки использовать блоки try/catch везде. Как правило, лучше позволить исключению распространяться как можно выше в стеке. Так что возможно ваш код должен иметь один, внешний try/catch/MessageBox.Show(ex.ToString()); Обратите внимание, что ex.Message выводит только текст сообщения, и вы захотите отобразить полное исключение.   -  person John Saunders    schedule 16.02.2012
comment
Трудно сказать, просто глядя на код, но если вы установите точку останова на foreach (FeaturedCharts fc in rc.featuredCharts), что будет содержимым rc.featuredCharts?   -  person Alan    schedule 16.02.2012
comment
Ваша переменная listCharts инициализирована?   -  person David Spence    schedule 16.02.2012
comment
@JohnSaunders Спасибо за совет. Я пробовал try/catch прямо перед внешним циклом, но полное исключение слишком сложно для меня, чтобы понять, что происходит не так.   -  person nos9    schedule 16.02.2012


Ответы (2)


Трудно сказать, потому что опубликованный вами объект json выглядит хорошо, но он неполный.

Начните здесь: http://json2csharp.com/

сравните классы, которые он генерирует, с вашими собственными.

person NotMe    schedule 16.02.2012
comment
Я уже пробовал это, но по какой-то причине это не работает для этой конкретной строки json. Я построил класс самостоятельно - person nos9; 16.02.2012

Если исключение возникает в строке string name = fc.name;, то fc должно быть нулевым, как бы маловероятно это ни казалось.

person John Saunders    schedule 16.02.2012
comment
исключение возникает на «rc.featuredCharts». он никогда не достигает кода во внутреннем цикле foreach. - person nos9; 16.02.2012
comment
Тогда rc.featuredCharts имеет значение null. - person John Saunders; 16.02.2012