преобразовать json nsdictionary в пригодный для использования массив - PullRequest
0 голосов
/ 20 сентября 2011

Я пытался найти наиболее эффективный способ преобразования ответа JSON в пригодный для использования массив, на который можно ссылаться как на источник данных UITableView.Пример здесь взят из бесплатного сервиса погоды World Weather Online.

У меня нет проблем с преобразованием JSON с использованием метода Jonathan Wights TouchJSON , но теперь у меня естьNSarray из NSDictionaries Я не могу найти эффективный способ перемещения данных в массив, кроме как грубой силой.То есть я могу получить любое значение из вложенных NSDictionaries, но единственный способ создать пригодный для использования массив - это взять каждое значение по отдельности и поместить его в нужное место в моем массиве.Я могу сделать это с помощью отдельного объекта, который создает массив со строками, представляющими каждое из значений в JSON-ответе, но должен быть лучший способ сделать это, чем использовать грубую силу.

Когда япопробуйте рекомендованные методы, которые я получаю «данные» в качестве ключа, а остальные выходные данные в качестве значения.Затем я создаю новый словарь objectforkey: @ "data", и он дает мне только массив из 4-х ключей "near_area", "current_condition", "weather" и "request".И если я пытаюсь создать новый NSDictionary из только что созданного NSDictionary, он выдаст мне ошибку.

Есть ли способ взять вложенные NSDictionaries и поместить ключи и значения во вложенном NSDictionary в nsarray?

Вот код

   - (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    NSString *webResult = [[NSString alloc] initWithData:receivedWeatherData encoding:NSUTF8StringEncoding];
    NSError *theError = NULL;
    receivedDictionary = [NSMutableDictionary dictionaryWithJSONString:webResult error:&theError];
    NSLog(@"\n%@\n",receivedDictionary);

Вот вывод, преобразованный в NSArray NSDictionarys

  {
    data =     {
        "current_condition" =         (
                        {
                cloudcover = 50;
                humidity = 44;
                "observation_time" = "01:24 AM";
                precipMM = "0.0";
                pressure = 1000;
                "temp_C" = 14;
                "temp_F" = 57;
                visibility = 10;
                weatherCode = 116;
                weatherDesc =                 (
                                        {
                        value = "Partly Cloudy";
                    }
                );
                weatherIconUrl =                 (
                                        {
                        value = "http://www.worldweatheronline.com/images/wsymbols01_png_64/wsymbol_0002_sunny_intervals.png";
                    }
                );
                winddir16Point = NW;
                winddirDegree = 310;
                windspeedKmph = 20;
                windspeedMiles = 13;
            }
        );
        "nearest_area" =         (
                        {
                areaName =                 (
                                        {
                        value = Hobart;
                    }
                );
                country =                 (
                                        {
                        value = Australia;
                    }
                );
                latitude = "-42.920";
                longitude = "147.330";
                population = 204863;
                region =                 (
                                        {
                        value = Tasmania;
                    }
                );
                weatherUrl =                 (
                                        {
                        value = "http://free.worldweatheronline.com/weather/Australia/106511/Hobart/110625/info.aspx";
                    }
                );
            }
        );
        request =         (
                        {
                query = "Lat -42.92 and Lon 147.33";
                type = LatLon;
            }
        );
        weather =         (
                        {
                date = "2011-09-20";
                precipMM = "2.4";
                tempMaxC = 12;
                tempMaxF = 54;
                tempMinC = 7;
                tempMinF = 45;
                weatherCode = 116;
                weatherDesc =                 (
                                        {
                        value = "Partly Cloudy";
                    }
                );
                weatherIconUrl =                 (
                                        {
                        value = "http://www.worldweatheronline.com/images/wsymbols01_png_64/wsymbol_0002_sunny_intervals.png";
                    }
                );
                winddir16Point = W;
                winddirDegree = 277;
                winddirection = W;
                windspeedKmph = 23;
                windspeedMiles = 14;
            }
        );
    };
}
...