簡體   English   中英

在SWIFT中解析JSON

[英]Parse JSON in SWIFT

嗨,我嘗試找到一種在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代碼= -1002“操作無法完成。(NSURLErrorDomain錯誤-1002。)” UserInfo = 0x7c12d610 {NSErrorFailingURLKey = XX,NSErrorFailingURLStringKey = XX,NSUnderlyingError = 0x7c12c8d0“操作無法完成。(( kCFErrorDomainCFNetwork錯誤-1002。)“}致命錯誤:在展開可選值時意外發現nil

一切都很好,因為這是我從請求中獲得的返回頁

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

是的,他無法將其解析為NSDirectory,因為它沒有返回的JSON(通常是這樣),因此有一種方法可以確保如果出現此頁面(因此用戶輸入了錯誤的用戶名),我可以退出我的循環/采取其他方式;)?

您正在使用許多可能全部失敗的操作,而Swift對於失敗完全是無法原諒的。 如果newURLPath為nil,而url0為nil,則代碼將崩潰,因為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。

由於您在此請求上收到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.
        }
    })

NSURL是一個失敗的初始化程序,當您提供無效的URL時,就會發生這種情況:它無法初始化。

因此,將代碼包裝在有條件的包裝中:

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

如果用戶輸入錯誤的數據,則url0變為nil 如果您將nil值用作url0! 應用程序將崩潰。

當您添加! 在變量之后,您告訴編譯器該值將不會為nil。

因此,為避免崩潰,您必須在調用前檢查nil條件

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM