Как сопоставить словарь с динамическими ключами с помощью ObjectMapper?

#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)
}