【问题标题】:Parsing Alamofire JSON解析 Alamofire JSON
【发布时间】:2021-03-07 13:42:34
【问题描述】:

我正在构建一个适用于 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

【问题讨论】:

    标签: swift alamofire


    【解决方案1】:

    您无法像这样访问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(read here),由于请求执行异步,你可以看看这个Q/A:read here。我也建议你,将parameters 作为参数传递给这个函数,不要全局声明。

    【讨论】:

    • 这更有意义。我以为我需要完成,但不确定如何构建。运行这个我得到一个错误:Cannot convert value of type 'DataResponse<GeneratedLinkToken, AFError>' to expected argument type 'GeneratedLinkToken'
    • @thetanis 我编辑了我的答案,现在应该可以使用了
    • 好的,我现在得到那个 switch 语句。我想我在这里失败的地方是掌握如何将字符串值从getLinkToken { linkObject in..... 分配给其他东西。该打印返回正确的值。我尝试为变量分配一个空值,然后将该值添加到其中。 ``` let test = getLinkToken { object in var test1 = "" test1 = object.linkToken print(test1) } ``` 但在此范围之外无法使用。抱歉,这里还在学习。
    • @thetanis 这似乎是一个不同的问题,如果你不能尝试自己解决它,只需创建另一个问题,不要混合问题。
    猜你喜欢
    • 2020-11-19
    • 1970-01-01
    • 1970-01-01
    • 2017-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多