2017-09-14 2 views
-1

Ich habe einen API-Aufruf zum Protokollieren meiner Benutzer in einer App erstellt. Ich benutze Alamofire und SwiftyJSON. API-Aufruf funktioniert gut und ich bekomme eine JSON Datei wie diese:Kann kein Objekt mit JSON-Antwort von API-Aufruf erstellen

{ 
    "code": 200, 
    "message": "OK", 
    "data": { 
     "user_id": 1, 
     "user_email": "test", 
     "user_username": "kk1", 
    } 
} 

Um die Benutzerinformationen in UserDefault zu speichern, ich möchte, dass meine User-Objekt mit diesem JSON Antwort erstellen. Hier ist das Modell

class LFUser: NSObject { 

    var user_id: Int? 
    var user_email: String? 
    var user_username: String? 

    init(dict: [String: AnyObject]){ 
     super.init() 
     user_id = dict["user_id"] as? Int 
     user_email = dict["user_email"] as? String 
     user_username = dict["user_username"] as? String 
    } 
} 

Hier ist der Teil der Login-Funktion, wenn der API-Aufruf und die Objectis erstellt:

func login(userEmail: String, userPassword: String, finished: @escaping(_ status:String,_ data: LFUser?)->()) { 

      if let value = response.result.value { 

      let dict = JSON(value) 
      let code = dict["code"].intValue 
      let message = dict["message"].stringValue 



      if let data = dict["data"].dictionary { 

       print(data) 
       let user = LFUser(dict: data as [String : AnyObject]) 
       print(user.user_email) 
       finished("Success", user) 

     } 
    } 

Der Druck (Daten) funktioniert gut, aber es gibt ein Problem, wenn die Schaffung Objekt und der Ausdruck (user.user_email) zeigen nil an.

+0

wie diesen Link etwas tun https://stackoverflow.com/questions/2315948/how-to-store-custom-objects-in-nsuserdefaults –

+0

ty dafür aber vielleicht es wird mein Problem nicht lösen, weil ich das Objekt nicht korrekt erstellen kann? –

+0

vielleicht ist das der nächste Schritt –

Antwort

0

Bitte überprüfen Sie dies:

if let data = dict["data"].dictionary { 
    let user = LFUser(dict: data) 
    print(user.user_email) 
    finished("Success", user) 
} 


class LFUser: NSObject { 

    var user_id: Int? 
    var user_email: String? 
    var user_username: String? 

    init(dict: [String : SwiftyJSON.JSON]){ 
     super.init() 
     user_id = dict["user_id"]?.intValue 
     user_email = dict["user_email"]?.stringValue 
     user_username = dict["user_username"]?.stringValue 
    } 
} 
+0

Sie haben Recht, das war wegen der [String: Any] im Modell. Ty –

0

ich für Swift 4 gehen würde Codable statt:

struct User: Codable { 
    let user_id: Int 
    let user_email: String 
    let user_username: String 
} 

struct Response: Codable { 
    let code: Int 
    let message: String 
    let data: User 
} 

Dann können Sie die eingehenden Daten wie das dekodieren:

let response = try JSONDecoder().decode(Response.self, from: jsonData) 

Dann wird, um den Wert auf Benutzereinstellungen zu speichern, können Sie kann JSONEncoder oder PropertyListEncoder verwenden, um den Wert zu Data zu kodieren.

+0

Interessant, werde ich das bald überprüfen. Vielen Dank. –

Verwandte Themen