2014-11-24 6 views
0

Привет, я пытаюсь найти способ разобрать JSON в SWIFT, это отлично работает для меня, но я столкнулся с проблемой.Parse JSON в SWIFT

Я даю пользователю ввести имя пользователя, которое используется для URL JSON -> если пользователь вводит правильное имя пользователя, все работает нормально.

Но если он введет неправильное имя пользователя, мой синтаксический анализ завершится неудачно, это тоже правильно, но на данный момент мое приложение только падает, и я ищу способ сделать работу.

Это мой код, где он выходит из строя,

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

Вы используете множество операций, которые могли бы все терпят неудачу, и Swift довольно неумолимый о неудаче. Ваш код будет сбой, если newURLPath равен нулю, если url0 равен нулю, потому что newURLPath не был допустимым URL.

Таким образом, ваш запрос URL-адреса может возвращать ошибку (сам запрос не удался), но у вас есть случай, когда запрос URL-адреса успешно выполнен, но дает неожиданные результаты (не словарь JSON). Ваш код, оканчивающийся на «как 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 - неудачный инициализатор, и это происходит, когда вы указываете неверный URL: он не инициализируется.

Так обернуть ваш код в условном развёртки:

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

, но это не решит проблему, если пользователь вводит неверный логин и я не буду получить JSON вправо? –

+0

Если вы не можете преобразовать newUrlPath! в URL-адрес, потому что строка является недопустимым URL-адресом, тогда вам нужно остановить ее и попросить пользователя ввести действительное имя пользователя. Вы не можете получить JSON с сервера, не получая сначала действительный URL-адрес ... –

-1

url0 становится nil, если пользователь вводит неверные данные. Если вы используете значение nil как url0!, приложение выйдет из строя.

Когда вы добавляете! после переменной вы укажете компилятору, что значение не будет равно нулю.

так, чтобы избежать аварий, вы должны проверить ноль условия перед вызовом

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

Ну, с этим я столкнулся с «Операнд постфикса»! »Должен иметь необязательный тип, тип - NSURL –

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. 
     } 
    })