【发布时间】:2018-02-10 14:37:59
【问题描述】:
我正在尝试解析来自 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: "The given data was not valid JSON.", underlyingError: Optional(Error Domain=NSCocoaErrorDomain Code=3840 "No value ." UserInfo={NSDebugDescription=No value.}))): 文件 /Library/Caches/com.apple.xbs/Sources/swiftlang/swiftlang-900.0.65/src/swift/stdlib/public/core/ErrorType.swift ,第 181 行
【问题讨论】:
-
如果你在解码之前登录
jsonData和responseString,你会看到什么? -
@ItaiFerber 我没有记录它们,即使我把 print(responseString) 放在了 ----responseString = String(data: data, encoding: .utf8) 之后!----它不显示
-
这意味着,你的代码永远不会被命中,
responseString保持其默认值””,这就是你无法解析它的原因 -
"No value",你的回复是空的?制作有用的打印:在闭包的开头,添加: print("Response: (response)"); print("任务错误:(错误)"); print("Data: (data); (String(data: data, encoding: .utf8)")`; 可能会有所帮助,但我认为您在某处有错误。