首页 文章

Swift JSON解析错误

提问于
浏览
-1

我试图解析来自rest api的JSON响应但是经常出错 .

我的请求发送和JSON解析代码如下,我还添加了Xcode的错误消息 .

我提前感谢任何帮助 .

我的JSON格式:

{
    "error":1,
    "name":"batuhan",
    "mail":"mymail@gmail.com",
    "password":"e10adc3949ba59abbe56e057f20f883e",
    "user_type":"user"
}

我的代码:

@IBAction func registerButton(_ sender: Any) {

    let name: String = self.name.text!
    let mail: String = self.mail.text!
    let password: String = self.password.text!


    var responseString: String = ""

    let url = URL(string: "http://my_webserver/index.php?process=register")!
    var request = URLRequest(url: url)
    request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
    request.httpMethod = "POST"
    let postString = "mail=\(String(describing: mail))&name=\(String(describing: name))&password=\(String(describing: password))&register_type=user"
    request.httpBody = postString.data(using: .utf8)
    let task = URLSession.shared.dataTask(with: request) { data, response, error in
        guard let data = data, error == nil else {                                                 // check for fundamental networking error
            print("error=\(String(describing: error))")
            return
        }

        if let httpStatus = response as? HTTPURLResponse, httpStatus.statusCode != 200 {           // check for http errors
            print("statusCode should be 200, but is \(httpStatus.statusCode)")
            print("response = \(String(describing: response))")
        }

        responseString = String(data: data, encoding: .utf8)!

    }


    struct RegisteredUser: Codable {
        let error: String
        let name: String
        let mail: String
        let password: String
        let user_type: String
    }


    let jsonData = responseString.data(using: .utf8)!
    let decoder = JSONDecoder()
    let user_data = try! decoder.decode(RegisteredUser.self, from: jsonData)

    print(user_data.name)
    print(user_data.mail)


    task.resume()
}

错误:

致命错误:'试试!'表达式意外地引发了一个错误:Swift.DecodingError.dataCorrupted(Swift.DecodingError.Context(codingPath:[],debugDescription:“给定数据无效JSON . ”,underlyingError:可选(错误域= NSCocoaErrorDomain Code = 3840“没有值 . “UserInfo = {NSDebugDescription = No value . }))):file /Library/Caches/com.apple.xbs/Sources/swiftlang/swiftlang-900.0.65/src/swift/stdlib/public/core/ErrorType.swift ,第181行

1 回答

  • 1

    你的问题有点过多,很明显你应该把它隔离在JSON解码中 . 无论如何:这是(琐碎的)答案 .

    在您的JSON数据中 error 是一个数字,在您的类定义中它是 String .

    因此,您有两个非常简单的路径来解决您的问题,您应该定义

    error: Int
    

    在你的 RegisteredUser 或你放

    "error":"1",
    

    进入你的 JSONdata .

    如果您在开始时显示的内容是从Web服务返回的,则必须调整 RegisteredUser 的格式以完全匹配JSON数据 . 记住: JSONDecoder.decode 非常挑剔,因为任何好的解析器应该是 .

    我通常建议捕获这样的错误,如果你正在与网络交谈,不要使用 try! ,因为有太多东西可能出错 . 虽然我不得不承认,在这种情况下 error.localizedDescription 并没有非常有帮助

    The data couldn’t be read because it isn’t in the correct format.
    

    然而,这确实指出了我正确的方向,因为它让我更仔细地阅读你的输入 .

    更新(带代码)

    我在操场上成功解析了 String ,如下所示:

    import Cocoa
    struct RegisteredUser: Codable {
        let error: Int
        let name: String
        let mail: String
        let password: String
        let user_type: String
    }
    
    var str = """
    {
    "error":1,
      "name":"batuhan",
      "mail":"mymail@gmail.com",
      "password":"e10adc3949ba59abbe56e057f20f883e",
      "user_type":"user"
    }
    """
    let jsonData = str.data(using: .utf8)!
    let decoder = JSONDecoder()
    
    do {
        let user_data = try decoder.decode(RegisteredUser.self, from: jsonData)
        print(user_data)
    } catch {
        print("error on decode: \(error.localizedDescription)")
    }
    

    这打印

    RegisteredUser(error: 1, name: "batuhan", mail: "mymail@gmail.com", password: "e10adc3949ba59abbe56e057f20f883e", user_type: "user")
    

    如果您希望我们帮助您,请发布不起作用的代码(以及您希望它做什么) .

相关问题