[英]JSON parsed data not being called? Swift
我已經從 API 解析了我的數據,但是當我嘗試從解析的 NSDictionary 數據中設置一些值時,不會調用 println 語句。 它發生在帶有“用戶”鍵的字典中,我嘗試設置學生的名字和姓氏。
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()
}
}
我的請求網址:
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"
}
當我在下面的客戶端中調用學生的名字和姓氏時,解包 Optional 值時發生致命錯誤:
UdacityClient.sharedInstance().firstName!) and UdacityClient.sharedInstance().lastName!
JSON 解析結果控制台日志:
{
error = "Parameter 'user_key' key contains unescaped special character '\"': 'Optional(\"3778758647\")'";
parameter = "user_key";
status = 400;
}
我看起來你的主要錯誤來自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 {
...
}
首先,我建議您使用 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() {}
}
以及使用 AFNetworking 獲取 NSData 的 func,將其轉換為 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)
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.