将字典解码为可编码结构数组

时间:2020-05-27 11:26:31

标签: json swift codable

我将JSON作为字典[String,Anyobject]:

{
  "AED": "United Arab Emirates Dirham",
  "AFN": "Afghan Afghani",
  "ALL": "Albanian Lek",
}

我需要将其解码为可编码结构货币数组,例如:

struct Currency: Codable {
  var code: String
  var name: String
}

Currency(code: "AED", name: "United Arab Emirates Dirham")

2 个答案:

答案 0 :(得分:3)

您可以将json解码为Dictionary并映射到Array。

let currencies = try? JSONDecoder()
        .decode([String: String].self, from: data)
        .map({ Currency(code: $0.key, name: $0.value) })

答案 1 :(得分:1)

您需要创建一个容器,例如名为“ Currencies”的容器才能使用单一值容器。

我为您分享了示例游乐场:

let str = """
{
  "AED": "United Arab Emirates Dirham",
  "AFN": "Afghan Afghani",
  "ALL": "Albanian Lek",
}
"""

struct Currencies: Codable {
    var values: [Currency]

    init(from decoder: Decoder) throws {
        let container = try decoder.singleValueContainer()
        let dict = try container.decode([String: String].self)

        values = dict.map({ (key, value) in
            return Currency(code: key, name: value)
        })
    }
}

struct Currency: Codable {
    var code: String
    var name: String

    enum CodingKeys: String, CodingKey {
        case code
        case name
    }
}

let currencies = try JSONDecoder().decode(Currencies.self, from: Data(str.utf8))
print(currencies.values)