2017-12-11 7 views
-1

ユーザー情報が表示されているページがあり、ユーザーに情報を更新する権限を与えたいと考えています。だから私は更新ボタンを作成し、ユーザーがそのボタンを押すと、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の新機能ですか?

+0

何が印刷されていますか?print(responseString!)? –

+0

構造体プロパティの変数を宣言するのではなく、定数として宣言し、変更する必要がある場合は新しい値で新しいオブジェクトを作成します。 –

+0

私はコンソールで受信したjsonを取得するために使用しましたが、結果を得ることができました。それを取り除くことができます –

答えて

1

すべての文字列がそのように二重引用符でラップされ、JSONを読んでください、heightweightageString、ないIntです。

この構造体で十分です。すべてのプロパティを非オプションとして宣言すると、関数は冗長です。

struct Update: Codable { 

    enum Sex : Codable, String { 
     case female, male, noSex = "no sex" 
    } 

    let userID: Int 
    let email: String 
    let password: String 
    let userName: String 
    let fullName: String 
    let sex: Sex 
    let height: String 
    let weight: String 
    let age: String 
    let score: Int 
    let createdAt: String 
    let updatedAt: String 

    enum CodingKeys: String, CodingKey { 
     case userID = "user_id" 
     case email, password, score 
     case userName = "user_name" 
     case fullName = "full_name" 
     case sex, height, weight, age, createdAt, updatedAt 
    } 
} 
関連する問題