我试图解析来自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))®ister_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 回答
你的问题有点过多,很明显你应该把它隔离在JSON解码中 . 无论如何:这是(琐碎的)答案 .
在您的JSON数据中
error
是一个数字,在您的类定义中它是String
.因此,您有两个非常简单的路径来解决您的问题,您应该定义
在你的
RegisteredUser
或你放进入你的
JSONdata
.如果您在开始时显示的内容是从Web服务返回的,则必须调整
RegisteredUser
的格式以完全匹配JSON数据 . 记住:JSONDecoder.decode
非常挑剔,因为任何好的解析器应该是 .我通常建议捕获这样的错误,如果你正在与网络交谈,不要使用
try!
,因为有太多东西可能出错 . 虽然我不得不承认,在这种情况下error.localizedDescription
并没有非常有帮助然而,这确实指出了我正确的方向,因为它让我更仔细地阅读你的输入 .
更新(带代码)
我在操场上成功解析了
String
,如下所示:这打印
如果您希望我们帮助您,请发布不起作用的代码(以及您希望它做什么) .