簡體   English   中英

未調用 JSON 解析數據? 迅速

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM