#ios #swift #objectmapper
#iOS #swift #objectmapper
Вопрос:
Я новичок в ObjectMapper. У меня есть ответ от сервера:
{
"123123": 10,
"435555": 2,
"435333": 8,
"567567": 4
}
Ключами (динамическими) будут идентификаторы. Значения будут учитываться. Как я могу сопоставить его с помощью ObjectMapper?
Мой код не работает, потому что динамические ключи:
extension Item: Mappable {
private static let kId = "id"
private static let kCount = "count"
public init?(map: Map) {
self.init()
}
mutating public func mapping(map: Map) {
id <- map[Item.kId]
count <- map[Item.kCount]
}
}
Комментарии:
1. Я чувствую, ObjectMapper не сможет вам помочь, поскольку это будут динамические идентификаторы. Почему вы не можете создать пользовательский класс / структуру / простой словарь для этого случая.
Ответ №1:
Ваш ответ представляет собой объект, и вы можете получить к нему доступ через map.JSON
, и его тип [String: Any]
. Затем вы можете использовать это как обычный Dictionary
.
Здесь я создаю класс с именем Model
, который имеет массив элементов (типа Item
), и в func mapping(:Map)
я сопоставил map.JSON
элементы с Item
.
class Model: Mappable {
typealias Item = (id: String, count: Int)
var items: [Item] = []
required init?(map: Map) {
}
func mapping(map: Map) {
let rawDictionary = map.JSON
let items = rawDictionary.compactMap { (key, value) -> Item? in
guard let intValue = value as? Int else { return nil }
return (key, intValue)
}
self.items = items
}
}
let jsonString = """
{
"123123": 10,
"435555": 2,
"435333": 8,
"567567": 4
}
"""
let model = Model(JSONString: jsonString)
print(model?.items[0]) //Optional((id: "123123", count: 10))
Ответ №2:
Вы можете попробовать
do{
let res = try JSONDecoder().decode([String:Int].self, from: data)
}
catch {
print(error)
}