2014-11-24 227 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. 
     } 
    })