繁体   English   中英

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 将返回[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 - 有关更多详细信息,请参阅他对原始问题的评论

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM