Swift Codable:解码动态密钥

Swift Codable: Decoding dynamic keys

我正在尝试练习 Swift 的 Codable API。 我发送了一个网络请求,每次都收到一行,如下所示,我必须处理动态密钥:

响应示例 1:

{
  "EUR": 4695.01
}

响应示例 2:

{
  "USD": 479.01
}

响应示例 3:

{
  "BTC": 4735.01
}

我试过这个方法来解析动态键:

struct ConversionResponseModel: Decodable {
    typealias destinationCurrency = String
    
    init(from decoder: Decoder) throws {
        let container = try decoder.singleValueContainer()
    }
}

和我的抓取请求:

do {
    let myResult = try JSONDecoder().decode(ConversionResponseModel.self, from: data)
                print(myResult)
            } catch {
                print(error)
            }

但我得到的结果是:ConversionResponseModel(),但不是货币值。 听起来我好像错过了什么。请任何帮助。谢谢

你快到了。您得到的 JSON 将 return 是 [String:Double] 的字典。然后你可以使用:

struct ConversionResponseModel: Decodable {
    typealias DestinationCurrency = String
    
    let currency : DestinationCurrency
    let value : Double
    
    init(from decoder: Decoder) throws {
        let container = try decoder.singleValueContainer()
        let dict = try container.decode([String:Double].self)
        guard let key = dict.keys.first else {
            throw NSError(domain: "Decoder", code: 0, userInfo: [:])
        }
        currency = key
        value = dict[key] ?? -1
    }
}

注意:考虑到 Rob Napier 的评论,您可以将 Decimal 替换为 Double——有关更多详细信息,请参阅他对原始问题的评论