嵌套的Json数据有问题

时间:2014-07-25 02:02:05

标签: json xcode swift

我在尝试访问嵌套的json数据时遇到了很多麻烦(粘贴在底部)。我能写:

 var dataResults = jsonResult["data"] as NSDictionary

然而,为了创建包含“数据”中的数据的字典,Xcode将不允许我调用“数据”中的任何内容,例如“current_condition”中的信息。我试图将current_condition作为自己的字典,如下所示:

var results = dataResults["current_condition"] as NSDictionary

但似乎这就是nil

我还尝试使用标准方法访问嵌套循环:

var dataResults = jsonResult["data"]["current_condition"] as NSDictionary

但这会导致编译错误。

有任何帮助吗?非常感谢!

Json数据:

{
data =     {
    "current_condition" =         (
                    {
            cloudcover = 0;
            humidity = 68;
            "observation_time" = "01:39 AM";
            precipMM = "0.0";
            pressure = 1017;
            "temp_C" = 20;
            "temp_F" = 68;
            visibility = 10;
            weatherCode = 143;
            weatherDesc =                 (
                                    {
                    value = Mist;
                }
            );
            weatherIconUrl =                 (
                                    {
                    value = "http://cdn.worldweatheronline.net/images/wsymbols01_png_64/wsymbol_0006_mist.png";
                }
            );
            winddir16Point = NE;
            winddirDegree = 50;
            windspeedKmph = 7;
            windspeedMiles = 4;
        }
    );
    request =         (
                    {
            query = "London, United Kingdom";
            type = City;
        }
    );
    weather =         (
                    {
            date = "2014-07-25";
            precipMM = "1.5";
            tempMaxC = 27;
            tempMaxF = 81;
            tempMinC = 14;
            tempMinF = 57;
            weatherCode = 353;
            weatherDesc =                 (
                                    {
                    value = "Light rain shower";
                }
            );
            weatherIconUrl =                 (
                                    {
                    value = "http://cdn.worldweatheronline.net/images/wsymbols01_png_64/wsymbol_0009_light_rain_showers.png";
                }
            );
            winddir16Point = NE;
            winddirDegree = 54;
            winddirection = NE;
            windspeedKmph = 15;
            windspeedMiles = 10;
        },
                    {
            date = "2014-07-26";
            precipMM = "5.8";
            tempMaxC = 28;
            tempMaxF = 83;
            tempMinC = 16;
            tempMinF = 61;
            weatherCode = 176;
            weatherDesc =                 (
                                    {
                    value = "Patchy rain nearby";
                }
            );
            weatherIconUrl =                 (
                                    {
                    value = "http://cdn.worldweatheronline.net/images/wsymbols01_png_64/wsymbol_0009_light_rain_showers.png";
                }
            );
            winddir16Point = NNE;
            winddirDegree = 12;
            winddirection = NNE;
            windspeedKmph = 11;
            windspeedMiles = 7;
        },
                    {
            date = "2014-07-27";
            precipMM = "0.2";
            tempMaxC = 26;
            tempMaxF = 80;
            tempMinC = 13;
            tempMinF = 55;
            weatherCode = 116;
            weatherDesc =                 (
                                    {
                    value = "Partly Cloudy";
                }
            );
            weatherIconUrl =                 (
                                    {
                    value = "http://cdn.worldweatheronline.net/images/wsymbols01_png_64/wsymbol_0002_sunny_intervals.png";
                }
            );
            winddir16Point = NW;
            winddirDegree = 321;
            winddirection = NW;
            windspeedKmph = 14;
            windspeedMiles = 9;
        },
                    {
            date = "2014-07-28";
            precipMM = "1.9";
            tempMaxC = 26;
            tempMaxF = 78;
            tempMinC = 12;
            tempMinF = 54;
            weatherCode = 116;
            weatherDesc =                 (
                                    {
                    value = "Partly Cloudy";
                }
            );
            weatherIconUrl =                 (
                                    {
                    value = "http://cdn.worldweatheronline.net/images/wsymbols01_png_64/wsymbol_0002_sunny_intervals.png";
                }
            );
            winddir16Point = N;
            winddirDegree = 351;
            winddirection = N;
            windspeedKmph = 13;
            windspeedMiles = 8;
        },
                    {
            date = "2014-07-29";
            precipMM = "0.0";
            tempMaxC = 28;
            tempMaxF = 82;
            tempMinC = 16;
            tempMinF = 60;
            weatherCode = 113;
            weatherDesc =                 (
                                    {
                    value = Sunny;
                }
            );
            weatherIconUrl =                 (
                                    {
                    value = "http://cdn.worldweatheronline.net/images/wsymbols01_png_64/wsymbol_0001_sunny.png";
                }
            );
            winddir16Point = NNW;
            winddirDegree = 329;
            winddirection = NNW;
            windspeedKmph = 13;
            windspeedMiles = 8;
        }
    );
};

}

2 个答案:

答案 0 :(得分:0)

奇怪的是,我有一个样本天气应用程序,我转换为Swift。我在其他地方得到了我的数据,但我发现这个库是在Swift中处理JSON的好方法:https://github.com/dankogai/swift-json/。更干净,更容易。

答案 1 :(得分:0)

这是因为subscript中的Dictionary会返回一个可选的:

subscript (key: KeyType) -> ValueType?

这意味着你必须先打开可选项才能进行向下转换:

let dataResults = jsonResult["data"]! as NSDictionary
let results = dataResults["current_condition"]! as NSDictionary

从Beta 3开始,您可以直接访问该值而无需向下转换,如下所示:

let dataResults = jsonResult["data"]!
let results = dataResults["current_condition"]

但是我会建议你把它包裹在if-let周围,以确保你不会打开nil值。