我如何使用 Alamofire 和 Swift 解码从 JSON 解码和访问 Double

How I can decode and access Double from JSON using Alamofire and Swift Decode

我尝试使用 Alamofire 和 Swift 解码并获取特定货币的特定汇率:

这是我的模型:

    struct Listek: Codable {
    let base: String
    let date: String
    let rates: [String: Double]

    enum CodingKeys: String, CodingKey {
        case base = "base"
        case date = "date"
        case rates = "rates"
    }
}

这是 Alamofire API 调用 + 解码

let apiToContact = "https://api.exchangeratesapi.io/latest"
    AF.request(apiToContact).responseJSON { (response) in
    print(response)
    guard let data = response.data else { return }
    do {
    let st = try JSONDecoder().decode(Listek.self, from: data)
        print (st.rates)
        print (st.base)
        print (st.date)

    }
    catch {
    print("error")
    }

到目前为止一切顺利,但我无法访问单一货币及其汇率值。我想声明一个变量 "JPYrate",其值为 JSON 中的日元汇率。你能帮我导航吗?

exchangeratesapi 似乎发送一致的数据。如果是这样,我的建议是将速率解码为专用结构

struct Listek: Decodable {
    let base: String
    let date: String
    let rates: Rates
}

struct Rates: Decodable {
    let CAD, HKD, ISK, PHP, DKK, HUF, CZK, AUD, RON, SEK, IDR, INR, BRL, RUB, HRK, JPY, THB, CHF, SGD, PLN, BGN, TRY, CNY, NOK, NZD, ZAR, USD, MXN, ILS, GBP, KRW, MYR : Double
}

然后就可以直接得到汇率了

print(st.rates.JPY)

你可以简单地从rates Dictionary中获取键JPY对应的值,像这样,

let JPYrate = st.rates["JPY"]

此外,如果键名与 属性 名称相同,则无需创建 enum CodingKeys。所以,你的 struct Listek 看起来像,

struct Listek: Codable {
    let base: String
    let date: String
    let rates: [String:Double]
}

首先,您可以计算 属性 以获取日元汇率:

var jpyRate: Double? { rates["JPY"] }

或按照@vadian 的建议将费率解析为特定类型。

其次,您可以使用 Alamofire 的 responseDecodable 方法自动进行解码。

AF.request(apiToContact).responseDecodable(of: Listek.self) { response in
    debugPrint(response)
}