2014-11-24 141 views
0

嗨,我試圖找到一種方法來解析SWIFT中的JSON,這對我很好,但我遇到了問題。解析SWIFT中的JSON

我讓用戶輸入用於JSON URL的用戶名 - >如果用戶鍵入有效的用戶名都可以正常工作。

但是,如果他輸入錯誤的用戶名我的解析失敗,這也是正確的,但現在我的應用程序只崩潰,我尋找一種方法來解決。

這是我的代碼而崩潰,

let url0 = NSURL(string: newUrlPath!) 
     let session0 = NSURLSession.sharedSession() 
     let task0 = session0.dataTaskWithURL(url0!, completionHandler: {data, response, error -> Void in 
      if (error != nil) { 
       println(error) 
      } else { 
       let summonorID_JSON = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: nil) as NSDictionary 

Xcode的錯誤

Error Domain=NSURLErrorDomain Code=-1002 "The operation couldn’t be completed. (NSURLErrorDomain error -1002.)" UserInfo=0x7c12d610 {NSErrorFailingURLKey=XX, NSErrorFailingURLStringKey=XX, NSUnderlyingError=0x7c12c8d0 "The operation couldn’t be completed. (kCFErrorDomainCFNetwork error -1002.)"} fatal error: unexpectedly found nil while unwrapping an Optional value

一切都很好的事業,這是返回頁面我從我的請求得到

https://br.api.pvp.net/api/lol/br/v1.4/summoner/by-name/smirknaitiax?api_key=5c7d4d4f-f320-43d5-8647-643c9f6ee5de

是的,他不能解析成NSDirectory作爲它的沒有JSON th在返回(正常情況下)是否有一種方法來注意,如果此頁面出現(所以用戶輸入了錯誤的用戶名),我可以退出我的循環/採取其他方式;)?

回答

3

您正在使用的許多操作可能全部失效之前檢查零狀態,斯威夫特是相當無情的擔心失敗。如果newURLPath爲零,而您的代碼會崩潰,如果url0爲零,因爲newURLPath不是有效的URL。

所以你的URL請求可能會返回一個錯誤(請求本身失敗),但你有這樣的情況,即URL請求成功但給出了意想不到的結果(不是JSON字典)。你的代碼以「as NSDictionary」結尾告訴Swift:「我知道我可能沒有得到一本字典,但是如果這不起作用,就把你得到的字典轉換成字典並崩潰」。只要改變這

if let parsedJSON = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: nil) 
{ 
    // Will still crash if the server sends a valid JSON array 
    let summonorID_JSON = parsedJSON as NSDictionary 
} 
else 
{ 
    // data wasn't valid JSON, handle it. 
} 

不同的是,由JSON解析器返回的可選值將不會崩潰被接受,您檢查是否接收到有效的JSON或沒有。

0

NSURL是一個failable初始值設定項,正確發生這種情況時,你給一個無效的網址:它無法初始化。

所以包裹在一個條件展開代碼:

if let url0 = NSURL(string: newUrlPath!) { 
    ... 
} 
+0

很好,但如果用戶輸入錯誤的用戶名,這將不解決這個問題,我不會得到一個JSON回來吧? – 2014-11-24 10:10:08

+0

如果你不能改變newUrlPath!因爲該字符串是一個無效的URL,因此您必須在那裏停下來並要求用戶輸入一個有效的用戶名。你不能從服務器獲取JSON,而沒有先得到一個有效的URL ... – 2014-12-04 10:20:08

-1

url0變得nil如果用戶輸入錯誤的數據。如果您使用零值作爲url0!應用程序將崩潰。

當你添加一個!在一個變量之後,你告訴編譯器該值不會爲零。

所以爲了避免撞車,你必須調用

let task0 = session0.dataTaskWithURL(url0!, completionHandler: {data, response, error -> Void in 
+0

那麼,我遇到了 「後綴」!「的操作數應該有可選類型;類型是NSURL – 2014-11-24 10:16:22

2

由於您對此請求獲得了404,我認爲這會在每次使用用戶名出現問題時發生,因此您應該處理服務器響應以適應此問題。第一件東西是要檢查服務器返回什麼:

let httpResp: NSHTTPURLResponse = response as NSHTTPURLRespons 

在這一點上,你可以訪問StatusCode屬性,會告訴你,如果請求是好還是不好(404)。有了這樣的信息,你可以決定做什麼,例如,你可以修改你的代碼是這樣的:

let url0 = NSURL(string: newUrlPath!) 
let session0 = NSURLSession.sharedSession() 
let task0 = session0.dataTaskWithURL(url0!, completionHandler: {data, response, error -> Void in 
    if (error != nil) { 
     println(error) 
    } else { 
     let httpResp: NSHTTPURLResponse = response as NSHTTPURLRespons 
     httpResp.statusCode != 404 { 
      let summonorID_JSON = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: nil) as NSDictionary 
     } else { 
      // Handle error at this point, tell user to retype username etc. 
     } 
    })