在 Swift 中将 Alamofire 结果解析为对象(使用:Alamofire、SwiftyJSON 和 ObjectMapper)

Posted

技术标签:

【中文标题】在 Swift 中将 Alamofire 结果解析为对象(使用:Alamofire、SwiftyJSON 和 ObjectMapper)【英文标题】:Parsing Alamofire result into objects in Swift (using: Alamofire, SwiftyJSON & ObjectMapper) 【发布时间】:2016-10-04 01:39:09 【问题描述】:

我在解析传入的 JSON 时遇到问题。

这是我的功能:

func postCheckUserPhonenumbers(phonenumbers:[String], completionHandler: (([AnyObject?], AnyObject?) -> Void)) 
        let urlString = Constant.apiUrl().stringByAppendingFormat(Constant.apiPostCheckUserPhonenumbers)

        let phoneNumbersDictionary = phonenumbers.map( ["number": $0] )

        let JSON = try? NSJSONSerialization.dataWithJSONObject(phoneNumbersDictionary, options: [])

        let request = NSMutableURLRequest(URL: NSURL(string: urlString)!)
        request.setValue("application/json", forHTTPHeaderField: "Content-Type")
        request.HTTPMethod = "POST"
        request.HTTPBody = JSON

        Alamofire.request(request).validate().responseJSON(completionHandler: response in
            if response.result.isSuccess
                if let value = response.result.value 
//                    let json = JSON(value)
                    if let users:Array<User> = Mapper<User>().mapArray(value) 
                        completionHandler(users, nil)
                     else 
                        completionHandler([nil], nil)
                    
                
            
            if response.result.isFailure
                let message = ApiMessage()
                message.message = "No users found"
                completionHandler([nil],message)
            
        )
    

通常我会先将结果转换为 JSON,但这次尝试执行此操作时会出现编译错误:

【问题讨论】:

你有一个名为 JSON 的变量,它是一个 NSData 【参考方案1】:

这确实是我在函数上方声明的 JSON 变量。我现在得到了这个:

func postCheckUserPhonenumbers(phonenumbers:[String], completionHandler: (([AnyObject?], AnyObject?) -> Void)) 
    let urlString = Constant.apiUrl().stringByAppendingFormat(Constant.apiPostCheckUserPhonenumbers)

    let phoneNumbersDictionary = phonenumbers.map( ["number": $0] )

    let inputJSON = try? NSJSONSerialization.dataWithJSONObject(phoneNumbersDictionary, options: [])

    let request = NSMutableURLRequest(URL: NSURL(string: urlString)!)
    request.setValue("application/json", forHTTPHeaderField: "Content-Type")
    request.HTTPMethod = "POST"
    request.HTTPBody = inputJSON

    Alamofire.request(request).validate().responseJSON(completionHandler: response in
        if response.result.isSuccess
            if let value = response.result.value 
                let json = JSON(value)
                let jsonString = json.rawString()
                if let users:Array<User> = Mapper<User>().mapArray(jsonString) 
                    completionHandler(users, nil)
                 else 
                    completionHandler([nil], nil)
                
            
        
        if response.result.isFailure
            let message = ApiMessage()
            message.message = "No users found"
            completionHandler([nil],message)
        
    )

【讨论】:

你这里没有使用 SwiftyJSON。在此示例中,您将 JSON 解析为 JSON 对象,稍后仅使用字符串表示,因此 ObjectMapper 将再次解析它(这次从字符串)。考虑使用包 github.com/tristanhimmelman/AlamofireObjectMapper 。或者用手做类似的事情。

以上是关于在 Swift 中将 Alamofire 结果解析为对象(使用:Alamofire、SwiftyJSON 和 ObjectMapper)的主要内容,如果未能解决你的问题,请参考以下文章

快速解析 Alamofire 结果

在 Swift 中将数组转换为 Alamofire 参数

如何在 Alamofire,swift 3 中将字典作为参数发送

Swift:JSON 解析未显示在 UILabel 中,但可以使用 Alamofire 在输出窗口中看到

如何在 Alamofire Swift iOS 中将 Origin 传递给 Header?

如何在 Swift 3 中使用 Alamofire 在 POST 请求中将给定的 JSON 作为参数发送?