[英]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
一切都很好,因為這是我從請求中獲得的返回頁
是的,他無法將其解析為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.