2016-11-29 2 views
1

로그인 기능 (POST 메소드)을 작성하려고하는데 결과적으로 사용자 세부 사항 및 기타 몇 가지 세부 사항이있는 JSON이 생성됩니다. POST 호출의 결과에서 사용해야하는 모든 필드가있는 클래스를 만들었습니다. 하지만 클래스의 객체에 json을 디시 리얼 라이징하는 문제에 직면하고 있습니다. 어떤 사람이 이것으로 나를 도울 수 있습니까?신속한 객체에 사전 (JSON)을 비 직렬화합니다.

내 코드 (. 내가 SO에 비슷한 질문을 본 및 솔루션을 사용하여 해결 시도 나는 var UserDetails = UserDetails(json:jsonString) 사용하여 신속 객체에 다음 문자열로 JSON 변환 및 시도) :

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; 
    } } 

내 컨트롤러 클래스 :

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 응답 :

{ 
    "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": [ 
    { ..... 

누가이 문제를 해결할 수 있습니까? 티아

당신이 유형 [String: Any]의 단일 매개 변수로 UserDetails 당신의 init 메소드를 정의하는 경우도 타자 스위프트 기본 Dictionary 대신 NSDictionary의 사용에 필요한 모든의
+0

여기에 귀하의 json 응답을 추가하십시오. –

+0

@NiravD는 JSON 응답으로 질문을 업데이트했습니다. 제발 봐주세요 – ASN

+0

당신은 파운데이션 클래스 (NSDictionary 등)를 사용하지 말고 스위프트 타입을 사용해야합니다. 그래서,'if json = JSONSerialization.jsonObject를 사용하면 (데이터 :, 옵션 : [])? [String : Any]' – Paulw11

답변

2

Foundation 클래스 (NSDictionary 등)는 사용하지 말고 신속한 유형을 사용하십시오.

나는 또한 당신이 사전에 받아 당신의 UserDetails 클래스에 failable initialiser를 추가 제안 :

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; 
    } 
} 

하고 완료 블록

가 :

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 { 

나는 또한 제거의 자유를했다을 _ _ 때문에 icky 귀하의 속성에서

+0

하이 폴. 나는 당신의 코드를 복사했고 나는이 경고를 가드 진술 근처에서 발견했다. '가드 조건 이후에 예외적으로 그리고 그 외의 경우'표현 필요함' – ASN

+0

예. 내 괄호가 엉망이 됐어. 나는 당신이 논평하는 것처럼 편집 중이었습니다. – Paulw11

+0

오케이 오케이. 오류가 수정되었습니다. 업데이트 주셔서 감사합니다. – ASN

1

첫째.

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; 
     } 

    } 
} 

이제이 json 응답의 init 메소드를 이와 같이 호출하십시오.

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