簡體   English   中英

無法將“__NSArray0”類型的值轉換為“NSDictionary”

[英]Could not cast value of type '__NSArray0' to 'NSDictionary'

當我解析我的 json 響應時,這是我的錯誤

無法將“__NSArray0”(0x104bcd838)類型的值轉換為“NSDictionary”(0x104bcf818)。

這是我的代碼

@IBAction func LoginAction(_ sender: Any) {

    let parameters: Parameters=[

        "email":emailUser.text!,
        "password":passWord.text!,

        ]
    let url2 = "http://marwen1994.alwaysdata.net/Carpooling/public/loginpost.php"
    Alamofire.request(url2, method: .post, parameters: parameters).responseJSON
        {
            response in
            let A = response.result.value as! Dictionary<String,Any>
          let list = A["items"] as! Dictionary<String,Any>
            let nom = list["name"] as! String
            let pass = A["password"] as! String
            let email = list["email"] as! String
            let adresse = A["adresse"] as! String
            let DateNaissance = A["DateNaissance"] as! String
            let id = A["id"] as! Int
            let numTel = A["num_tel"] as! Int
            if(pass == self.passWord.text)
            {
                UserDefaults.standard.set(true, forKey: "ConnectionStatus")
                UserDefaults.standard.set(id, forKey: "ConnectedID")
                UserDefaults.standard.set(nom, forKey: "nom")
               // UserDefaults.standard.set(prenom, forKey: "prenom")
                UserDefaults.standard.set(email, forKey: "email")
                UserDefaults.standard.set(adresse, forKey: "adresse")
                UserDefaults.standard.set(pass, forKey: "motDePasse")
                UserDefaults.standard.set(numTel, forKey: "numTel")
                UserDefaults.standard.set(DateNaissance, forKey: "DateNaissance")
                self.performSegue(withIdentifier: "toProfile", sender: nil)
            }
            else{
                let alert = UIAlertController(title: "Woah!!!", message: "You inserted a wrong email or a wrong password! Please enter a valid mail and password.", preferredStyle: .alert)

                alert.addAction(UIAlertAction(title: "Ok", style: .cancel, handler: nil))

                self.present(alert, animated: true)
            }
    }
}

如果沒有看到實際的 JSON 響應,很難知道錯誤在哪里,但這可能是一個數組而不是一個字典

let list = A["items"] as! Dictionary<String,Any>

應該是這樣的

let list = A["items"] as! Array

如果您可以考慮使用Codable這可能會有所幫助

struct JsonResponse: Decodable {
    let items: [Item]
}

struct Item: Decodable {
    let id: String
    let name: String
    let email: String
    let encrypted_password: String
    let num_tel: String
    let adresse: String
    let DateNaissance: String
}

實際的解碼是這樣完成的

let decoder = JSONDecoder()
do {
    let jsonResponse = try decoder.decode(JsonResponse.self, from: data)

    for item in jsonResponse.items {
        UserDefaults.standard.set(item.name, forKey: "nom")
        UserDefaults.standard.set(item.email, forKey: "email")
        //and so on
    }
} catch {
    print("Decode error: \(error)")
}

dataresponse的 json 消息,我不知道 Alamofire 是如何工作的,因此您需要弄清楚如何正確訪問它。


“items”中有一個數組,只有一個元素,可以像這樣訪問它

if let A = response.result.value as? Dictionary<String,Any>, let list = A["items"][0] as? Dictionary<String,Any> {

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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