декодировать словарь в массив кодируемых структур - PullRequest
0 голосов
/ 27 мая 2020

У меня есть JSON как словарь [String, Anyobject]:

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

Мне нужно декодировать его как массив кодируемых структур Currency, например:

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

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

Ответы [ 2 ]

3 голосов
/ 27 мая 2020

Вы можете декодировать json как словарь и сопоставить его с массивом.

let currencies = try? JSONDecoder()
        .decode([String: String].self, from: data)
        .map({ Currency(code: $0.key, name: $0.value) })
1 голос
/ 27 мая 2020

Вам нужно создать контейнер, например, с именем «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)
...