2014-07-10 200 views
2

我正在尝试新的iOS语言,但我遇到了问题。我将分析如下所示的JSON:用Swift解析Json

{ 
    "coord":{ 
     "lon":-0.13, 
     "lat":51.51 
    }, 
    "sys":{ 
     "message":0.1947, 
     "country":"GB", 
     "sunrise":1404964557, 
     "sunset":1405023356 
    }, 
    "weather":[ 
     { 
     "id":501, 
     "main":"Rain", 
     "description":"moderate rain", 
     "icon":"10d" 
     } 
    ], 
    "base":"cmc stations", 
    "main":{ 
     "temp":291.87, 
     "pressure":1018, 
     "humidity":87, 
     "temp_min":287.15, 
     "temp_max":295.45 
    }, 
    "wind":{ 
     "speed":3.1, 
     "deg":350, 
     "var_beg":320, 
     "var_end":30 
    }, 
    "rain":{ 
     "3h":0.5 
    }, 
    "clouds":{ 
     "all":75 
    }, 
    "dt":1404999902, 
    "id":2643743, 
    "name":"London", 
    "cod":200 
} 

我从天气预报服务得到了JSON,到现在为止我做了如下方法:

func getWeatherFinished(json:NSDictionary) { 
    if (json != nil) { 
     var weather: NSArray = json.objectForKey("weather") as NSArray 
     var weatherDict: NSDictionary = weather.objectAtIndex(0) as NSDictionary 
     var weatherConditions: NSString = weatherDict.objectForKey("description") as NSString 

     var mainDict: NSDictionary = json.objectForKey("main") as NSDictionary 
     var temp: NSString = mainDict.objectForKey("temp") as NSString 
     var humidity: NSString = mainDict.objectForKey("humidity") as NSString 
     var minTemp: NSString = mainDict.objectForKey("temp_min") as NSString 
     var maxTemp: NSString = mainDict.objectForKey("temp_max") as NSString 

     var windDict: NSDictionary = json.objectForKey("wind") as NSDictionary 
     var speed: NSString = windDict.objectForKey("speed") as NSString 
     var deg: NSString = windDict.objectForKey("deg") as NSString 
    } 
} 

但是当我运行该应用程序会崩溃和我不知道为什么。我的代码有什么问题?它为什么会崩溃?

错误截图: enter image description here

当我得到的JSON我写了这个代码:

func connectionDidFinishLoading(connection: NSURLConnection!) { 

      var json: AnyObject! = NSJSONSerialization.JSONObjectWithData(receiveData, options: NSJSONReadingOptions(1), error: nil) 
     if let jsonDict = json as? NSDictionary { 
      getWeatherFinished(json as NSDictionary) 
     } 

} 
+0

你有崩溃任何错误的详细信息?此外,当类型可以由作业推断时,您不需要将其作为声明的一部分包含在内。 – Joe

+0

我把错误的截图,没有其他的信息 – lucgian841

+0

你说'作为NSDictionary'不允许由于错误JSONObjectWithData是'nil'的可能性。使用'as? NSDictionary'来获得一个可选的'NSDictionary'('NSDictionary?')。 – Jesper

回答

2

尝试检查,以确保您的JSON是非零和可以是一个字典:

func connectionDidFinishLoading(connection: NSURLConnection!) { 
    var json: AnyObject! = NSJSONSerialization.JSONObjectWithData(receiveData, options: NSJSONReadingOptions(1), error: nil) 
    if let jsonDict = json as? NSDictionary{ 
     getWeatherFinished(json) 
    } 

} 

此行崩溃是因为它具有'temp'键的对象不是NSString。

var temp: NSString = mainDict.objectForKey("temp") as NSString 

从您的JSON它看起来是一个数字,所以你可以尝试这个:

var tempNum: NSNumber = mainDict.objectForKey("temp") as NSNumber 
var temp: NSString = tempNum.stringValue() 
+0

仍然一样:它以同样的方式崩溃......我更新了我的问题中的代码 – lucgian841

+1

尝试打开异常断点并找到崩溃的行:http://blog.manbolo.com/2012/01/23/xcode-tips-1-break-on-exceptions – connor

+0

我试过了,它在以下几行崩溃: 'var temp:NSString = mainDict.objectForKey(“temp”)as NSString' 它在这里和在相同的指令中崩溃 – lucgian841