tolerate_Me_Thx
tolerate_Me_Thx

Reputation: 387

Getting JSON by using Alamofire and decode - Swift 4

I have an API and I also want to get request.
But I try to using JSONDecoder to convert data type and I failed.
I don't know how to decode this Json like following data.
I want to take json["response"] contents setting my User struct.
Have any suggestion to me? Thanks.

Error Domain=NSCocoaErrorDomain Code=4865 "No value associated with key id ("id")." UserInfo={NSCodingPath=( ), NSDebugDescription=No value associated with key id ("id").}

This is JSON Data:

{
"status": "success",
"response": {
"id": "1130f1e48b608f79c5f350dd",
"name": "Jack",
},
"errors": ""
}


enum RestfulAPI:String {
    case userInfo = "http://www.mocky.io/v2/5a796fb92e00002a009a5a49"

    func get(parameters:[String : Any]? = nil,success:@escaping (_ response : Data)->(), failure : @escaping (_ error : Error)->()){
        let url = self.rawValue
        Alamofire.request(url, method: .get, parameters: parameters, encoding: JSONEncoding.default, headers: nil).responseJSON { (response) in
            switch response.result {
                case .success:
                if let data = response.data {
                    success(data)
                }
                case .failure(let error):
                    failure(error)
            }
       }
    }    
}

struct User: Decodable {
    let id: String
    let name: String
}

usage:

RestfulAPI.userInfo.get(success: { data in
     do {
         let user = try JSONDecoder().decode(User.self, from: data)
         print("==) ", user.id, user.name)
     }catch let error as NSError{
         print(error)
     }
 }) { (error) in
        print(error)
 }

Upvotes: 3

Views: 8802

Answers (1)

vadian
vadian

Reputation: 285069

The key id is not on the level where you expect it. That's what the error message states.
The keys id and name are in the (sub)dictionary for key response.

So you need an umbrella struct

struct Root : Decodable {
   let status: String
   let response: User
}

struct User: Decodable {
    let id: String
    let name: String
}

Then decode

let root = try JSONDecoder().decode(Root.self, from: data)
let user = root.response

Upvotes: 9

Related Questions