解析 Alamofire JSON

Parsing Alamofire JSON

我正在构建一个适用于 Plaid 的应用程序。 Plaid 提供了一个不错的小 LinkKit,我需要用它来获取我的 link_token。我提供 link_token 以向银行进行身份验证。我已经使用 Alamofire 编写了一个请求,当有人想要添加另一个帐户时发送 .post 以获得新的 link_token。我的问题是,当我将 JSON 解码为我构建的结构时,我似乎无法使用存储的 link_token 值。

检索代码link_token

let parameters = PlaidAPIKeys(client_id: K.plaidCreds.client_id,
                              secret: K.plaidCreds.secret,
                              client_name: K.plaidCreds.client_name,
                              language: K.plaidCreds.language,
                              country_codes: [K.plaidCreds.country_codes],
                              user: [K.plaidCreds.client_user_id: K.plaidCreds.unique_user_id],
                              products: [K.plaidCreds.products])

func getLinkToken() {
    
    let linkTokenRequest = AF.request(K.plaidCreds.plaidLinkTokenURL,
                                      method: .post,
                                      parameters: parameters,
                                      encoder: JSONParameterEncoder.default).responseDecodable(of: GeneratedLinkToken.self) { response in
                                        print(response)
                                    }
                                    }

我构建的结构:

struct GeneratedLinkToken: Decodable {
    let expiration: String
    let linkToken: String
    let requestID: String
    
    enum CodingKeys: String, CodingKey {
       case expiration = "expiration"
       case linkToken = "link_token"
       case requestID = "request_id"
    }
}

我已经通过在按下我的添加帐户或虚拟按钮时调用函数 getLinkToken() 进行了测试,我确实取回了我需要的数据。为什么我不能在请求后直接访问 GeneratedLinkToken.linkToken

您无法像这样访问 linkToken 属性:GeneratedLinkToken.linkToken,因为 linkToken 例如 属性(read here)

如果你想在请求后获取一个实例,你可以这样做:

func getLinkToken(completion: @escaping ((GeneratedLinkToken) -> Void)) {
    let linkTokenRequest = AF.request(K.plaidCreds.plaidLinkTokenURL,
                                      method: .post,
                                      parameters: parameters,
                                      encoder: JSONParameterEncoder.default).responseDecodable(of: GeneratedLinkToken.self) { response in
                                        print(response)

                                        // if response is an object of type GeneratedLinkToken
                                        switch response.result {
                                        case .success(let object):
                                            completion(object)                                             
                                        case .failure(let error):
                                             // hanlde error
                                        }
                                    }
}

稍后您可以调用为:

getLinkToken { linkObject in
    print("My tokne: \(linkObject.linkToken)")
}

我添加了completion() to your method, since the request executing async, you can take a look at this Q/A: 。我也建议你,将parameters作为参数传递给这个函数,而不是全局声明它。