Вы можете сделать это в два этапа, если хотите.Сначала объявите структуру для полученного json
struct KeyValue: Decodable {
let key: String
let value: String
}
Затем деокодируйте json и отобразите результат в словарь, используя пары ключ / значение.
do {
let result = try JSONDecoder().decode([String: [KeyValue]].self, from: data)
if let array = result["user"] {
let dict = array.reduce(into: [:]) { $0[$1.key] = $1.value}
Затем закодируйте этот словарь в jsonи обратно с использованием структуры для пользователя
struct User: Decodable {
let id: String
let name: String
let group: String
let city: String
let country: String
}
let userData = try JSONEncoder().encode(dict)
let user = try JSONDecoder().decode(User.self, from: userData)
Весь блок кода становится
do {
let decoder = JSONDecoder()
let result = try decoder.decode([String: [KeyValue]].self, from: data)
if let array = result["user"] {
let dict = array.reduce(into: [:]) { $0[$1.key] = $1.value}
let userData = try JSONEncoder().encode(dict)
let user = try decoder.decode(User.self, from: userData)
//...
}
} catch {
print(error)
}
Немного громоздко, но не требуется ручное сопоставление ключа / свойства.