2015-09-06 47 views
2

我已經從API解析了我的數據,但是當我嘗試從解析的NSDictionary數據中設置一些值時,println語句不會被調用。它發生在字典中用「用戶」鍵,我嘗試設置學生的名字和姓氏。JSON解析的數據沒有被調用? Swift

func getUserData(hostViewController: UIViewController) { 
     if self.userID == nil{ 
      println("User ID is nil") 
     } 
     else { 
     var key = self.userID 
     let urlString = UdacityClient.Constants.BaseURLSecure + "/users" + "/\(key)" 
     println(urlString) 
     let url = NSURL(string: urlString.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)!) 
     let request = NSMutableURLRequest(URL: url!) 


     let task = session.dataTaskWithRequest(request) {data, response, error in 
      if error != nil { 
       dispatch_async(dispatch_get_main_queue(), {() -> Void in 
        println(error) 
        let alertController = UIAlertController(title: "Oh no", message: "Error in User Data", preferredStyle: UIAlertControllerStyle.Alert) 

        let cancelAction = UIAlertAction(title: "Retry", style: UIAlertActionStyle.Default, handler: { (alert) -> Void in 
         hostViewController.dismissViewControllerAnimated(true, completion: nil) 
        }) 
        alertController.addAction(cancelAction) 

        hostViewController.presentViewController(alertController, animated: true, completion: nil) 
       }) 

       println("Error in User Data") 

      } else { 
       let newData = data.subdataWithRange(NSMakeRange(5, data.length - 5)) 
       var parsingError: NSError? = nil 
       let parsedResult = NSJSONSerialization.JSONObjectWithData(newData, options: NSJSONReadingOptions.AllowFragments, error: &parsingError) as! NSDictionary 


       if let userDictionary = parsedResult["user"] as? [String: AnyObject] { 
        if let firstName = userDictionary["first_name"] as? String { 
         self.firstName = firstName 
         println("This is not printing ") 
         println(firstName) 
        } 
       } 

       if let userDictionary = parsedResult["user"] as? [String: AnyObject] { 
        if let lastName = userDictionary["last_name"] as? String { 
         self.lastName = lastName 
         println("This is not printing also") 
         println(lastName) 
        } 
       } 

       if let err = parsingError { 
        dispatch_async(dispatch_get_main_queue(),{() -> Void in 
         println(err) 
         let alertController = UIAlertController(title: "Oh no", message: "Error in Parsing User Data from Udacity", preferredStyle: UIAlertControllerStyle.Alert) 

         let cancelAction = UIAlertAction(title: "Retry", style: UIAlertActionStyle.Default, handler: { (alert) -> Void in 
          hostViewController.dismissViewControllerAnimated(true, completion: nil) 
         }) 
         alertController.addAction(cancelAction) 

         hostViewController.presentViewController(alertController, animated: true, completion: nil) 
        }) 

       } 


      } 
      } 


     task.resume() 
     } 
    } 

我的請求URL:

https://www.udacity.com/api/users/Optional("3778758647") 

我ResponseKeys結構

struct JSONResponseKeys { 
     //getSessionID 
     static let Status = "status" 
     static let Account = "account" 
     static let Key = "key" 
     static let Session = "session" 
     static let ID = "id" 

     //getUserData 
     static let User = "user" 
     static let FirstName = "first_name" 
     static let LastName = "last_name" 


    } 

致命錯誤而展開的可選值發生在我稱爲第一姓名和我的客戶的學生姓名如下:

UdacityClient.sharedInstance().firstName!) and  UdacityClient.sharedInstance().lastName! 

JSON解析結果控制檯日誌

{ 
    error = "Parameter 'user_key' key contains unescaped special character '\"': 'Optional(\"3778758647\")'"; 
    parameter = "user_key"; 
    status = 400; 
} 
+0

log parsedResult並顯示結果。 – Shoaib

+0

您是否嘗試過'userDictionary [「first_name」]作爲AnyObject!如?字符串' –

+0

@Shoaib完成。請參閱更新後的問題。 –

回答

2

我看起來像你的主要錯誤是由於userID是一個需要展開的可選值。這就是爲什麼你看到

https://www.udacity.com/api/users/Optional("3778758647") 而不是 https://www.udacity.com/api/users/3778758647和你的服務器錯誤說同樣的事情。

試試這個基本輪廓,而不是:

if self.userID == nil { 
    ... 
} 

你可以使用保護語句提前返回,就像這樣:

guard let userID = self.userID as? String else { return } 

這個也有展開你的價值利益,得到擺脫"Optional()"

另一種方式將使用:

if let userID = self.userID as? String { 
    ... 
} 
0

首先,我建議你使用SwiftyJson數據解析(雖然我們是在它,你可以使用Alamofire甚至afnetworking爲REST調用)。

我給你幾個例子,用Swify解析數據有多簡單。

這是一個對象

public class MyObject: NSObject, JsonInitializableProtocol { 
var name = "" 
var value = "" 
var count = 0 

required public init(json:JSON) { 
    name = json["Name"].stringValue ?? "" 
    value = json["Value"].stringValue ?? "" 
    count = json["Count"].intValue ?? 0 
} 

override init() {} 
} 

而一個FUNC是GET與AFNetworking NSData的,將其轉換成JSON並創建和類型MyObject來的對象模型,並通過completionBlock其傳遞迴

func getObjWithUrl(url: String, completionHandler: (object: MyObject?, error: NSError?) -> Void) { 
     manager.GET(url, parameters: nil, success: { (operation: AFHTTPRequestOperation!, data: AnyObject?) -> Void in 
       let json = JSON(data : data as! NSData) 
       let myObject = MyObject(json: json) 
       completionHandler(myObject, nil) 
      }, failure: { (operation: AFHTTPRequestOperation!, error: AnyObject?) -> Void in 
       if let operationUnwrapped = operation as AFHTTPRequestOperation? { 
        var error = NSError(operation: operationUnwrapped, message: nil) 
        completionHandler(nil, wsError) 
       } 
      } 
    } 
+0

感謝您的建議,但您可以通過更具體地回答我的問題來提供更多幫助。 –