【问题标题】:Unable to Extract token from JSON Response using Almofire in swift4无法在 swift 4 中使用 Alamofire 从 JSON 响应中提取令牌
【发布时间】:2020-01-29 12:12:26
【问题描述】:

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

JSON 响应:

成功获取数据{ 数据 = { 令牌= “eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VySWQiOiJiODcwY2Q4My0zZDMzLTQ1ODgtYmZlMi00MzQ0ODQ4ZmJiOGMiLCJDb250YWN0SWQiOiJiODU4NTAyYy1lZGM2LTRlY2QtYTk0ZC1kMjEwNmI3YjZlMmQiLCJuYmYiOjE1Njk4Mjk1OTAsImV4cCI6MTU2OTgzNjc5MCwiaWF0IjoxNTY5ODI5NTkwfQ.LO2Z4n0IRYaaJM6Pmp8pLeo3alDPmioaAF4ces2K-9M”; }; 消息 = ""; 状态=成功; }

我可以从上面的 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。在与密钥status 相同的级别上,还有一个密钥data。令牌位于该嵌套字典中。并且不要在 Swift 中使用 NS... 集合类型。使用原生类型。

标签: ios json swift4


【解决方案1】:

首先,您必须修改您的 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

【讨论】:

  • i Jakir 很遗憾,我无法控制 JSON 格式。你能不能请指导我如何使用现有的 JSON 格式修改我的代码
猜你喜欢
  • 2021-09-17
  • 1970-01-01
  • 2014-11-15
  • 2020-03-10
  • 1970-01-01
  • 2020-03-28
  • 1970-01-01
  • 2021-12-10
相关资源
最近更新 更多