2016-11-29 3 views
1

Ich versuche, eine Login-Funktion (POST-Methode) zu erstellen und das Ergebnis ist ein JSON mit Benutzerdetails und einige andere Details. Ich habe eine Klasse mit allen Feldern erstellt, die ich aus dem Ergebnis des POST-Aufrufs verwenden muss. Aber ich habe ein Problem damit, den JSON zum Objekt der Klasse zu deserialisieren. Kann mir jemand dabei helfen? (. Ich habe auf SO ähnliche Fragen gesehen und versuchte, die Lösung unter Verwendung der Lösung Ich habe versucht, die json string Umwandlung und dann zu schnelles Objekt mit var UserDetails = UserDetails(json:jsonString) )Deserialize ein Wörterbuch (JSON) zu einem schnellen Objekt

Mein Code:

class UserDetails { 
    let token:String 
    let agent_id: Int 
    let user_id:Int 
    let company_id:Int 
    let affliate_Id:Int 
    let role_id:Int 
    let username: String 
    let surname:String 
    let lastname:String 

    init(token:String,agent_id: Int,user_id:Int,company_id:Int,affliate_Id:Int,role_id:Int,username: String,surname:String,lastname:String) { 
     self.token = token; 
     self.agent_id = agent_id; 
     self.user_id = user_id; 
     self.company_id = company_id; 
     self.affliate_Id = affliate_Id; 
     self.role_id = role_id; 
     self.username = username; 
     self.surname = surname; 
     self.lastname = lastname; 
    } } 

Mein Controller-Klasse:

let task = session.dataTask(with: request as URLRequest) { data, response, error in 
       guard data != nil else { 
        print("no data found: \(error)") 
        return 
       } 

       do { 
        if let json = try JSONSerialization.jsonObject(with: data!, options: []) as? NSDictionary { 
         NSLog("Login SUCCESS"); 
         let prefs:UserDefaults = UserDefaults.standard 
         prefs.set(username, forKey: "USERNAME") 
         prefs.set(udid, forKey: "UDID") 
         prefs.synchronize() 
         print("Response: \(json)") 

         //var jsonString = NSString(data: json, encoding: String.Encoding.utf8)! as String 
//when I tried to do the above statement, an error is thrown. Cannot convert value of type NSDictionary to expected argument type Data 
         //var person:UserDetails = UserDetails(json: jsonString) 

         self.dismiss(animated: true, completion: nil) 
        } else { 
         let jsonStr = NSString(data: data!, encoding: String.Encoding.utf8.rawValue)// No error thrown, but not NSDictionary 
         print("Error could not parse JSON: \(jsonStr)") 
        } 
       } catch let parseError { 
        print(parseError)// Log the error thrown by `JSONObjectWithData` 
        let jsonStr = NSString(data: data!, encoding: String.Encoding.utf8.rawValue) 
        print("Error could not parse JSON: '\(jsonStr)'") 
       } 
      } 

      task.resume() 

JSON Antwort:

{ 
    "user": { 
    "token": "ABCDEFGHI", 
    "agent_id": 0, 
    "user_id": 151, 
    "company_id": 1, 
    "affiliate_Id": 0, 
    "role_id": 1, 
    "username": "testman1", 
    "surname": "Test", 
    "lastname": "man", 
    }, 
    "menu": [ 
    { ..... 

Kann jemand mir helfen, dieses zu lösen. Tia

+0

Fügen Sie Ihre JSON-Antwort hier in Frage. –

+0

@NiravD hat die Frage mit der JSON-Antwort aktualisiert. Bitte werfen Sie einen Blick auf – ASN

+0

Sie sollten vermeiden, Foundation-Klassen (NSDictionary etc.) zu verwenden und Swift-Typen verwenden. Also, 'wenn json = JSONSerialization.jsonObject ausprobieren (mit: data !, options: []) als? [String: Any] ' – Paulw11

Antwort

2

Sie sollten die Verwendung von Foundation-Klassen (NSDictionary usw.) vermeiden und Swift-Typen verwenden.

Ich schlage vor, Sie auch eine failable initialiser zu Ihrer UserDetails Klasse hinzufügen, die einen Wörterbuch akzeptiert:

class UserDetails { 
    let token: String 
    let agentId: Int 
    let userId: Int 
    let companyId: Int 
    let affliateId: Int 
    let roleId: Int 
    let username: String 
    let surname: String 
    let lastname: String 

    init?(dictionary: [String:Any]) { 

     guard let token = dictionary["token"] as? String, 
      let agentId = dictionary["agent_id"] as? Int, 
      let userId = dictionary["user_id"] as? Int, 
      ... // And so on 
     else { 
      return nil 
     } 

     self.token = token; 
     self.agentId = agentId; 
     self.userId = userId; 
     self.companyId = companyId; 
     self.affliateId = affliateId; 
     self.roleId = roleId; 
     self.username = username; 
     self.surname = surname; 
     self.lastname = lastname; 
    } 
} 

und in Ihrem Abschluss Block:

do { 
    if let json = try JSONSerialization.jsonObject(with: data!, options: []) as? [String:Any] { 

     if let userDict = json["user"] as [String:Any] { 
       guard let userObject = UserDetails(dictionary:userDict) else { 
        print("Failed to create user from dictionary") 
        return 
       } 
       // Do something with userObject 
     } 
    } 

    } catch let parseError { 

nahm ich auch die Freiheit, die die Beseitigung _ von Ihren Eigenschaften, weil _ sind icky

+0

Hallo Paul. Ich kopierte Ihren Code und ich bekam diesen Fehler in der Nähe von Guard-Statement "außer sonst nach Guard-Bedingung" und fast sonst "Ausdruck erforderlich" – ASN

+0

Ja. Meine Zahnspange war durcheinander. Ich habe gerade bearbeitet, als Sie kommentierten – Paulw11

+0

Oh ok ok. Fehler behoben. Danke für das Update. – ASN

1

Zunächst einmal müssen Sie Swift nativen Dictionary statt NSDictionary verwenden, auch Teig, wenn Sie Ihre init-Methode von UserDetails mit einzelnen Parameter des Typs [String: Any] definieren.

class UserDetails { 
    var token:String = "" 
    var agent_id: Int = 0 
    var user_id:Int = 0 
    var company_id:Int = 0 
    var affliate_Id:Int = 0 
    var role_id:Int = 0 
    var username: String = "" 
    var surname:String = "" 
    var lastname:String = "" 

    init(userDic: [String: Any]) { 

     if let token = user["token"] as? String, let agent_id = user["agent_id"] as? Int, 
      let user_id = user["user_id"] as? Int, let company_id = user["company_id"] as? Int, 
      let affliate_Id = user["affliate_Id"] as? Int, let role_id = user["role_id"] as? Int, 
      let username = user["username"] as? String, let surname = user["surname"] as? String, 
      let lastname = user["lastname"] as? String { 

       self.token = token; 
       self.agent_id = agent_id; 
       self.user_id = user_id; 
       self.company_id = company_id; 
       self.affliate_Id = affliate_Id; 
       self.role_id = role_id; 
       self.username = username; 
       self.surname = surname; 
       self.lastname = lastname; 
     } 

    } 
} 

Jetzt einfach diese Init-Methode aus Ihrer JSON-Antwort wie folgt aufrufen.

if let json = try JSONSerialization.jsonObject(with: data!, options: []) as? [String: Any], let userDic = json["user"] as? [String: Any]{ 
    let userDetails = UserDetails(userDic: userDic) 
} 
Verwandte Themen