繁体   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