ユーザー情報が表示されているページがあり、ユーザーに情報を更新する権限を与えたいと考えています。だから私は更新ボタンを作成し、ユーザーがそのボタンを押すと、APIに情報を送信し、新しい値についてはjsonを取得します。私の問題は、私が私の構造にそのjsonを解読することができないということです。ここで が、私は自分のデータを送信する方法である:ここSwiftコードで構造体のJSONをデコードできません
var user: Update?
@IBAction func save_user_info_action(_ sender: UIButton) {
var me = Me()
let user_credentials = UserDefaults.standard
guard let id = user_credentials.value(forKey: userDefaults_info.id.rawValue) else {return}
let username = self.username_txt.text
let fullname = self.fullName_txt.text
let email = self.email_txt.text
let sex = self.sex_txt.text
let height = self.height_txt.text
let weight = self.wight_txt.text
let age = self.age_txt.text
let password = self.password_txt.text
if (username != "" && fullname != "" && email != "" && sex != "" && height != "" && weight != ""){
let url = URL(string: "\(API.user_info_update.rawValue)\(id)")!
var request = URLRequest(url: url)
request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
request.httpMethod = "PUT"
let postString = "user_name=\(username!)&email=\(email!)&password=\(password!)&sex=\(sex!)&height=\(height!)&weight=\(weight!)&age=\(age!)&full_name=\(fullname!)"
request.httpBody = postString.data(using: .utf8)
let task = URLSession.shared.dataTask(with: request) { data, response, error in
guard let data = data, error == nil else {
print("error=\(String(describing: error))")
return
}
if let httpStatus = response as? HTTPURLResponse, httpStatus.statusCode != 200 {
print("statusCode should be 200, but is \(httpStatus.statusCode)")
print("\(String(describing: response))")
}
let responseString = String(data: data, encoding: .utf8)
print(responseString!)
guard var result = responseString else { return }
if let json = try? JSONDecoder().decode(Update.self, from: data){
self.user = json
print("username : \(self.user?.userID)")
}
}
task.resume()
、結果として、私は、次のJSONを取得する==>
{"user_id":13,"email":"[email protected]","password":"pass","user_name":"jhx","full_name":"no name","sex":"no sex","height":"0","weight":"0","age":"","score":0,"createdAt":"2017-12-10T05:18:42.000Z","updatedAt":"2017-12-11T05:36:58.000Z"}
とも私は=にJSONをデコードしたい私の構造であり、 =>
import UIKit
struct Update: Codable {
let userID : Int?
let email : String?
let password : String?
let userName : String?
var fullName:String?
var sex:String?
var height:Int?
var weight:Int?
var age:Int?
var score : Int?
var createdAt:String?
var updatedAt:String?
func getUserID() -> Int {
return self.userID!
}
func getScore() -> Int {
return self.score!
}
func getEmail() -> String {
return self.email!
}
func getPassword() -> String {
return self.password!
}
func getUsername() -> String {
return self.userName!
}
func getFullname() -> String {
return self.fullName!
}
func getSex() -> String {
return self.sex!
}
func getHeight() -> Int{
return self.height!
}
func getWeight() -> Int{
return self.weight!
}
func getCreatedAt() -> String {
return self.createdAt!
}
enum CodingKeys: String, CodingKey {
case userID = "user_id"
case email
case password
case score
case userName = "user_name"
case fullName = "full_name"
case sex
case height
case weight
case age
case createdAt
case updatedAt
}
}
しかし、うまくいきません。私はそれをデバッグしようとしましたが、私はif let json = try? JSONDecoder().decode(Update.self, from: data){
の行にあるようですが、プログラムはif文を入力しません。どこで私は間違いをしているのですか?どうすれば修正できますか?迅速なJSONの新機能ですか?
何が印刷されていますか?print(responseString!)? –
構造体プロパティの変数を宣言するのではなく、定数として宣言し、変更する必要がある場合は新しい値で新しいオブジェクトを作成します。 –
私はコンソールで受信したjsonを取得するために使用しましたが、結果を得ることができました。それを取り除くことができます –