iOS应用程序接收正确格式化的JSON,但仍然返回为不以数组或对象

时间:2016-10-22 16:29:28

标签: php ios json swift parsing

所以基本上我的服务器上有一个登录脚本,它根据用户凭据是正确还是错误返回结果,并且我有一个iOS应用程序将数据发送到该登录脚本以返回正确或错误的结果。

以下是我的登录页面的相关部分,其中显示了返回代码($ userDetails是对正确或错误凭据的TRUE或FALSE检查):

$userDetails = $dao->getUserDetailsWithHashedPassword($email,$password);
if($userDetails===TRUE) {
    $returnValue["status"] = "Success";
    $returnValue["message"] = "User logged in !";
    echo json_encode($returnValue);
} else {
    $returnValue["status"] = "error";
    $returnValue["message"] = "User not found";
    echo json_encode($returnValue);
}

如果有人需要查看getUserDetailsWithHashedPassword()的内容,click here

使用Postman测试HTTP POST,一切正常,发布email@email.com&正文中的testpassword并使用正确的Content-Type(application / x-www-form-urlencoded):

{"status":"error","message":"User not found"}

现在我的iOS应该用这段代码来解释:

@IBAction func loginButtonPressed(_ sender: AnyObject) {
        let userEmail = emailLoginField.text
        let userPassword = passwordLoginField.text
        // Check for empty fields
        if((userEmail?.isEmpty)! || (userPassword?.isEmpty)!) { 
            // Display alert message
            displayMyAlertMessage(userMessage: "All fields are required");     
            return ;
        }
        // Send user data to server side
        let myUrl = URL(string: "https://support.vincentsolutions.ca/userLogin.php");
        var request = URLRequest(url:myUrl!);
        request.httpMethod = "POST";
        request.addValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
        let postString = "email=\(userEmail!)&password=\(userPassword!)";
        request.httpBody = postString.data(using: String.Encoding.utf8);

        URLSession.shared.dataTask(with: request, completionHandler: { (data:Data?, response:URLResponse?, error:Error?) -> Void in
            if error != nil {
                print ("error=\(error)")
                return
            }
            do {
                let json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? NSDictionary
                if let parseJSON = json {
                    var resultValue = parseJSON["status"] as? String
                    print("result: \(resultValue)")
                    var isUserLoggedIn:Bool = false;
                    if(resultValue=="Success") {
                        // Login is successful
                        UserDefaults.standard.set(true, forKey: "isUserLoggedIn");
                        UserDefaults.standard.synchronize();    
                        self.performSegue(withIdentifier: "loginSuccesful", sender: self)
                    }
                    var messageToDisplay:String = parseJSON["message"] as! String!;
                    if(!isUserLoggedIn) {
                        messageToDisplay = parseJSON["message"] as! String!;
                    }
                    DispatchQueue.main.async(execute: {
                        // Display alert message with confirmation.
                        var myAlert = UIAlertController(title: "Alert", message: messageToDisplay, preferredStyle: UIAlertControllerStyle.alert);

                        let okAction = UIAlertAction(title: "Ok", style: UIAlertActionStyle.default){ action in
                            self.dismiss(animated: true, completion: nil);
                        } 
                        myAlert.addAction(okAction);
                        self.present(myAlert, animated: true, completion: nil);
                    });   
                }  
            } catch let error as NSError {
                print("An error occured: \(error)")
            }
        }).resume()

现在,当我从iOS App运行代码时,我收到此错误:

  

发生错误:错误域= NSCocoaErrorDomain代码= 3840" JSON文本   没有从数组或对象和选项开始,不允许片段   。组"

有人看到这里有什么问题吗?我曾尝试在SO和互联网上查找该错误,但无法找到与我的情况相关的任何内容。

1 个答案:

答案 0 :(得分:0)

这是因为您从URL接收的响应可能不是正确的JSON格式。我建议你做两件事 -

  1. 尝试NSLog数据和响应
  2. 试试这个
  3. 让json =尝试NSJSONSerialization.JSONObjectWithData(data!,options:NSJSONReadingOptions.AllowFragments)!的NSDictionary