2014-12-05 2 views
-2

Я новичок в программировании на iOS, и я пытаюсь использовать новый язык Swift. У меня проблема/я не знаю, как в разборе JSON с Swift для использования iOS. Я уже использовал JSON в Android, так что я знаю, что JSON и ссылку правильно, но когда я пытаюсь следующий код (видел в учебнике) приложение, кажется, аварии и подчеркнул эту строку:JSON Parsing error with Swift

var jsonResult = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: &err) as NSDictionary 

консоль возвращает мне эту ошибку:

The operation couldn’t be completed. (NSURLErrorDomain error -1005.) fatal error: unexpectedly found nil while unwrapping an Optional value 

Вот весь код действия данной кнопки:

let urlAsString = "http://xxxxxxxxxx.altervista.org/App/_DD_/downloadutenti.php?email="+campoEmail.text+"&password="+campoPassword.text 
    let url = NSURL(string: urlAsString)! 
    let urlSession = NSURLSession.sharedSession() 

    println(url) 
    println(urlSession) 
    let jsonQuery = urlSession.dataTaskWithURL(url, completionHandler: { data, response, error -> Void in 
     if (error != nil) { 
      println(error.localizedDescription) 
     } 
     var err: NSError? 

     if(data != nil){ 
      var jsonResult = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: &err) as NSDictionary 


     if (err != nil) { 
      println("JSON Error \(err!.localizedDescription)") 
     } 

      var jsonEmail = "" 
      if var jsonEmail: String! = jsonResult["email"] as? NSString{ 

      } 
      else{ 
       println("PROBLEM 1") 
      } 

      var jsonPassword = "" 
      if var jsonPassword: String! = jsonResult["pass"] as? NSString{ 

      } 
      else{ 
       println("PROBLEM 2") 
      } 

     dispatch_async(dispatch_get_main_queue(), { 
      self.scritta2.text = "Email: " + jsonEmail + " - Password: " + jsonPassword 
     }) 
    } 
    }) 
    jsonQuery.resume() 

NB Я использую симулятор xcode6, и я точно знаю, что «переменные» campoEmail.text и campoPassword.text взяты в хорошем смысле.

JSON он должен вернуть:

[{"id":"1","email":"[email protected]","password":"pass","permessi":"1","stato":"Italia","citta":"Palermo","via":"Via Lincoln, 29","cap":"90100","telefono":"091xxxxxx"}] 

редактирования.К @Neo ПОМОЩЬ: я редактировал все действия кнопки, как это, но код переходит в нуль проверяет данные .. В

let curURL: NSURL = NSURL(string: "http://fantacharleston.altervista.org/App/_DD_/[email protected]&password=pass")! 
     let curRequest: NSURLRequest = NSURLRequest(URL: curURL, cachePolicy: NSURLRequestCachePolicy.ReloadIgnoringLocalAndRemoteCacheData, timeoutInterval: 60) 
     NSURLConnection.sendAsynchronousRequest(curRequest, queue: NSOperationQueue.mainQueue()) { (response: NSURLResponse!, data: NSData?, error: NSError!) -> Void in 

      if (data != nil) { 
       if let jsonArray: NSArray = NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers, error: nil) as NSArray? { 

        let jsonObject: NSDictionary? = jsonArray.objectAtIndex(0) as? NSDictionary 
        if (jsonObject != nil) { 
         NSLog("object: %@", jsonObject!) 
         let email: NSString? = jsonObject?.objectForKey("email") as? NSString 
         let password: NSString? = jsonObject?.objectForKey("password") as? NSString 

         if (email != nil && password != nil) { 
          dispatch_async(dispatch_get_main_queue(), {() -> Void in 
           self.scritta2.text = "Email: " + email! + " - Password: " + password! 
          }) 
         } 


        } 

       } 
      } 
      else{ 
       println("null") 
      } 
     } 
+0

Можете ли вы предоставить мне часть JSON, которую вы пытаетесь разобрать? –

+1

Вы должны, как правило, включать в себя все сообщение об ошибке, которое вы получили. –

+0

Я добавил то, что он должен отдать. @Neo –

ответ

2

Да, я думаю, я знаю, где ваша проблема ... Вы пытаетесь поставить JSONArray в NSDictionary ... Это не пойдет ... Это похоже на попытку помещать его в JSONObject в Java.

Просто обменивайтесь NSDictionary с NSArray и не забудьте получить свойства типа array [0] ["key"], а не как array ["key"], потому что вы работаете с массивом, а не со словарем .. . (его как ArrayList и HashMap в Java)

Попробуйте это пожалуйста ...

if let jsonResult: NSArray = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: &err) as NSArray? { 

let jsonEmail: NSString? = jsonResult.objectAtIndex(0).objectForKey("email") 

} 

Редактировать с кодом вам нужно

Вот она ... Я написал это немного как я бы написал его в Java для Android ... Я думаю, вы будете легко получить ... Проблема, которую вы прокомментировали, возможно, заключалась в том, что в вашем JSON нет тега «pass» ... его «пароль» ...

let curURL: NSURL = NSURL(string: "http://fantacharleston.altervista.org/App/_DD_/[email protected]&password=pass")! 
     let curRequest: NSURLRequest = NSURLRequest(URL: curURL, cachePolicy: NSURLRequestCachePolicy.ReloadIgnoringLocalAndRemoteCacheData, timeoutInterval: 60) 
     NSURLConnection.sendAsynchronousRequest(curRequest, queue: NSOperationQueue.mainQueue()) { (response: NSURLResponse!, data: NSData?, error: NSError!) -> Void in 

      if (data != nil) { 
       if let jsonArray: NSArray = NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers, error: nil) as NSArray? { 

        let jsonObject: NSDictionary? = jsonArray.objectAtIndex(0) as? NSDictionary 
        if (jsonObject != nil) { 
         NSLog("object: %@", jsonObject!) 
         let email: NSString? = jsonObject?.objectForKey("email") as? NSString 
         let password: NSString? = jsonObject?.objectForKey("password") as? NSString 

         if (email != nil && password != nil) { 
          dispatch_async(dispatch_get_main_queue(), {() -> Void in 
           self.scritta2.text = "Email: " + email + " - Password: " + password 
          }) 
         } 


        } 

       } 
      } 
     } 
+0

Спасибо @Neo! Ну, это была хорошая помощь, потому что приложение не сработало сейчас, но оно возвращает пустые значения. Ссылка, которая возвращает JSON это: http://fantacharleston.altervista.org/App/_DD_/[email protected]&password=pass вы можете мне помочь, пожалуйста? Что-то не так с массивом [0] ["key"] "/" array ["key"] "? P.S. Отладка говорит мне: «Ошибка JSON Не удалось выполнить операцию. (Ошибка какао 3840.)» –

+0

Хорошо, дайте мне десять минут, я «провёл» вас что-то вместе, что решит вашу проблему ... –

+0

Ok спасибо вам –