json - 尝试从 json 获取数据时对成员 `jsonObject(with:options:)` 的引用不明确

标签 json swift

我是 Swift 新手,在制作其中一个教程(相当旧)时,其中涉及通过返回 JSON 的 php 从服务器获取凭据,但我遇到了错误 对成员 jsonObject 的模糊引用(with:options:) 在 json var 中,我搜索并尝试应用不同的解决方案,但无济于事。 :(

感谢您的时间和帮助。

这是我的代码:

let userEmail = userEmailTextField.text;
let userPassword = userPasswordTextField.text;

if((userEmail?.isEmpty)! || (userPassword?.isEmpty)!) {
    displayMyAlertMessage(userMessage: "All Fields are required.")
    return;
}

let myUrl = URL(string: "/UserLogin.php");
var request = URLRequest(url:myUrl!);
request.httpMethod = "POST";
let postString = "email\(userEmail)&password=\(userPassword)";

request.httpBody = postString.data(using: String.Encoding.utf8);

let task = URLSession.shared.dataTask(with: request as URLRequest) {
data, URLResponse, error in

    if error != nil {
        //print = ("error=\(error)");
        return
    }

    var err: Error?
    var json = JSONSerialization.jsonObject(with: data, options: .mutableContainers, error: &err) as? NSDictionary

    if let parseJSON = json {
        var resultValue:String = parseJSON["status"] as String!;
        print("result: \(resultValue)")


        if(resultValue == "Success") {
            //Login Succesful
            UserDefaults.standard.set(true, forKey:"isUserLoggedIn");
            UserDefaults.standard.synchronize();
            self.dismiss(animated: true, completion: nil);

        }
    }
}

task.resume()

最佳答案

有两个主要问题:

  1. 实际发生错误是因为完成 block 中的response参数错误。它必须是参数标签/变量,而不是 URLResponse 类型。

    let task = URLSession.shared.dataTask(with: request) {  data, response, error in
    
  2. 由于您使用的是 Swift 3,因此 jsonObject(with 中没有 error 参数。该方法会抛出,您需要一个 do - catch block 。而且,与往常一样,选项 .mutableContainers 在 Swift 中完全没用。省略该参数。

    do {
        if let parseJSON = try JSONSerialization.jsonObject(with: data) as? [String:Any],
           let resultValue = parseJSON["status"] as? String {
              print("result: ", resultValue)
    
              if resultValue == "Success" {
                  //Login Succesful
                  UserDefaults.standard.set(true, forKey:"isUserLoggedIn")
                  self.dismiss(animated: true, completion: nil)
              }
        }
    } catch {
      print(error)
    }
    

其他一些注意事项:

  • 要安全地检查文本字段,请使用可选绑定(bind)

    guard let userEmail = userEmailTextField.text, !userEmail.isEmpty, let userPassword = userPasswordTextField.text, !userPassword.isEmpty else {
        displayMyAlertMessage(userMessage: "All Fields are required.")
        return
    }
    
  • 始终将 Swift 常量声明为 let(例如 resultValue)
  • 不要在 Swift 中使用 NSArray/NSDictionary。使用原生类型。
  • 请勿在 if 条件和尾随分号周围使用括号。 Swift 中不需要它们。
  • UserDefaults.standard.synchronize() 也不需要。
  • String.Encoding.utf8 可以简化为 .utf8

关于json - 尝试从 json 获取数据时对成员 `jsonObject(with:options:)` 的引用不明确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44937336/

相关文章:

json - 解析 json 时使用未解析的标识符

iOS 使 UIScrollView 分页仅对一个方向启用

ios - 为什么在向其 append 对象后数组为空

ios - 如何在 UICollectionView 中循环不可见的单元格

json - 我对 Haskell 的 Text.JSON 的使用被认为是丑陋的?

javascript - 如何按特定顺序正确收集json数据

javascript - AJAX 返回错误 JSON 输入意外结束

ios - 如何获取集合下文档下的数据计数?

Swiftui 渐变制作器 Spacer 无用

javascript - 如何查看某个键是否包含值并将该键返回 2 级?亚历克斯/JS