无法在 swift 4 中使用 Alamofire 从 JSON 响应中提取令牌

Unable to Extract token from JSON Response using Almofire in swift4

有人可以帮助我了解如何在 swift4 中使用 almofire 从我的一个 Web 服务请求中提取令牌。我想将令牌存储在其中一个变量中。下面我发布了来自我的网络服务的 JSON 响应。我还发布了我用 swift4 编写的代码。我是 Swift4 的新手,所以如果您需要其他信息来回答我的问题,请告诉我。我用粗体突出显示了代码行,并在出现错误的地方进行了注释。可能是我没有正确读取 JSON 数据。我是 JSON 数组和对象的新手。请帮助我提供代码示例。

JSON 响应:

Successfully got data { data = { token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VySWQiOiJiODcwY2Q4My0zZDMzLTQ1ODgtYmZlMi00MzQ0ODQ4ZmJiOGMiLCJDb250YWN0SWQiOiJiODU4NTAyYy1lZGM2LTRlY2QtYTk0ZC1kMjEwNmI3YjZlMmQiLCJuYmYiOjE1Njk4Mjk1OTAsImV4cCI6MTU2OTgzNjc5MCwiaWF0IjoxNTY5ODI5NTkwfQ.LO2Z4n0IRYaaJM6Pmp8pLeo3alDPmioaAF4ces2K-9M"; }; message = ""; status = Success; }

我可以从上面的 JSON 响应中提取状态,但我无法提取令牌 下面是我的 swift4 代码。

import UIKit
import Alamofire
import SwiftyJSON

class ViewController: UIViewController{
let URL_USER_LOGIN = "some url"
  let defaultValues = UserDefaults.standard

@IBOutlet weak var labelMessage: UILabel!
    @IBOutlet weak var textFieldUserName: UITextField!

    @IBOutlet weak var textFieldPassword: UITextField!

    @IBAction func buttonLogin(_ sender: Any) {

let parameters: Parameters=[
            "username":textFieldUserName.text!,
            "password":textFieldPassword.text!
        ]


Alamofire.request(URL_USER_LOGIN, method: .post,parameters: parameters,encoding: JSONEncoding.default, headers: headers).responseJSON
            {

                response in
let jsonData = response.result.value as? NSDictionary
let status = jsonData? ["status"] as! String

// when I use **tokendata = jsonData? ["token"] as! String**   I am getting Error Please help me with code fixes 

if status == "Success" {

let profileViewController = self.storyboard?.instantiateViewController(withIdentifier: "ProfileViewcontroller") as! ProfileViewController
                        self.navigationController?.pushViewController(profileViewController, animated: true)


                        self.dismiss(animated: false, completion: nil)

                    }else{
                        //error message in case of invalid credential
                        let alert = UIAlertController(title: "Alert", message: "Email or Passowrd is Not matching", preferredStyle: .alert)
                        let ok = UIAlertAction(title: "Ok", style:.default, handler: nil)
                        alert.addAction(ok)
                        self.present(alert, animated: true, completion: nil)
                        //self.labelMessage.text = "Invalid username or password"
                    }
                }
        }


 override func viewDidLoad() {
        super.viewDidLoad()

        let backButton = UIBarButtonItem(title: " ", style: UIBarButtonItem.Style.plain, target: navigationController, action: nil)
        navigationItem.leftBarButtonItem = backButton

        if defaultValues.string(forKey: "username") != nil{
            let profileViewController = self.storyboard?.instantiateViewController(withIdentifier: "ProfileViewcontroller") as! ProfileViewController
            self.navigationController?.pushViewController(profileViewController, animated: true)

        }
    }

override func viewWillAppear(_ animated: Bool) {
        navigationController?.isNavigationBarHidden = true
    }

首先,您必须修改您的 JSON 回复。因为格式不好。您的 JSON 应该如下所示。

{
  "status" : "Success",
  "message" : "your message",
  "data":{"token" : "your_token"}
}

您正在使用 SwiftyJSON。所以你可以用 SwiftyJSON 解析你的值,如下所示

let json = try JSON(data: response.data)

let status = json["status"].stringValue

let message = json["message"].stringValue 

let data = json["data"].dictionaryValue

let token = data["token"]?.stringValue