[swift] ObjectMapper를 사용하여 JSON 데이터의 필드 타입을 동적으로 매핑하는 방법은?

Objective-C나 Swift로 JSON 데이터를 다룰 때, ObjectMapper는 많은 개발자에게 선호되는 라이브러리입니다. ObjectMapper를 사용하면 JSON 데이터를 쉽게 모델 객체로 매핑할 수 있습니다. 이 라이브러리는 타입 선언을 필요로 하므로, JSON 데이터의 필드가 매핑될 모델 객체의 필드 타입을 미리 알아야 합니다. 그러나 때로는 JSON 데이터의 필드 타입이 동적으로 결정되는 경우가 있습니다. 이러한 경우 ObjectMapper 에서 제공하는 type(of:) 함수를 사용하여 필드 타입을 동적으로 매핑할 수 있습니다.

아래의 예제 코드를 통해 동적 타입 매핑을 적용하는 방법을 알아보겠습니다.

import ObjectMapper

struct User: Mappable {
    var name: Any?
    var age: Any?

    init?(map: Map) {}

    mutating func mapping(map: Map) {
        name <- (map["name"], DynamicFieldType())
        age <- (map["age"], DynamicFieldType())
    }
}

class DynamicFieldType: TransformType {
    typealias Object = Any
    typealias JSON = Any

    func transformFromJSON(_ value: Any?) -> Any? {
        return value
    }

    func transformToJSON(_ value: Any?) -> Any? {
        return value
    }
}

let jsonString = """
    {
        "name": "John",
        "age": 30
    }
"""

let user = Mapper<User>().map(JSONString: jsonString)

위 코드에서, User 구조체는 Mappable 프로토콜을 준수하며, 필드 nameageAny 타입으로 선언합니다. DynamicFieldType은 ObjectMapper에서 제공하는 TransformType 프로토콜을 구현한 클래스입니다. TransformType 은 ObjectMapper가 필드 값을 매핑하기 위해 사용하는 프로토콜로, transformFromJSONtransformToJSON을 구현해야 합니다. DynamicFieldTypetransformFromJSON 메서드는 JSON 데이터의 필드 값을 변환하지 않고 그대로 반환하도록 구현합니다.

User 구조체의 mapping 메서드에서, nameage 필드는 DynamicFieldType을 사용하여 매핑됩니다. 이를 통해 필드 타입을 동적으로 매핑할 수 있게 됩니다.

마지막으로, let user = Mapper<User>().map(JSONString: jsonString) 코드를 통해 JSON 데이터를 모델 객체로 매핑합니다.

DynamicFieldType을 사용하여 ObjectMapper를 활용하면 JSON 데이터의 필드 타입을 동적으로 매핑하는 것이 가능합니다. 이를 통해 더욱 유연하고 범용적인 코드를 작성할 수 있습니다.

참고 자료: