3

I'm new to ObjectMapper. I have response from the server:

{
      "123123": 10,
      "435555": 2,
      "435333": 8,
      "567567": 4
}

Keys (dynamic) are going to be IDs. Values are going to be COUNT. How can I map it with ObjectMapper?

My code isn't working because dynamic keys:

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
  • I feel, ObjectMapper won't be able to help you as it will be dynamic Ids. Why can't you create custom class/struct/simple dictionary for this case. Commented Mar 13, 2019 at 12:03

2 Answers 2

3

Your response is an object and you can access it via map.JSON, and its type is [String: Any]. Then you can use that like a normal Dictionary.

Here I create a class named Model that has array of items (of type Item) and in func mapping(:Map) I mapped map.JSON elements to 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))

Sign up to request clarification or add additional context in comments.

Comments

2

You can try

 do{

    let res = try JSONDecoder().decode([String:Int].self, from: data)

}
catch {

    print(error)
}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.