使用 ObjectMapper 的不同类型 JSON 文件

Different types JSON file using ObjectMapper

我正在使用 AlamofireObjectMapper 与后端服务器通信。其中一个请求的结果是一个项目数组,其中包含两个值:

两个 ArbitraryDataType 类 没有任何共同的祖先(Mappable 除外)。它甚至可以是基本类型、数组、可选类型等。

如何让 AlamofireObjectMapper 使用适当的类型解析 "arbitraryData" 字段。

请参阅以下 JSON 文件:

{
    "arrayOfItems": [
        {
            "typeIdentifier": "X",
            "arbitraryData":
                {
                    "value": "BLA",
                }
        },
        {
            "typeIdentifier": "Y",
            "arbitraryData":
                {
                    "anotherValue": "BLUBB",
                }
        }
    ]
}

我对应的 Swing 文件如下所示:

class Item : Mapping {
    var typeIdentifier = "X"
    var arbitraryData: Mappable? = nil

    init?(_ map: Map) {
        self.init()
        mapping(map)
    }

    func mapping(map: Map) {
        typeIdentifier <- map["typeIdentifier"]

        // THIS LINE CONTAINS MY QUESTION: HOW CAN I TELL OBJECTMAPPER, THAT,
        // IF typeIdentifier CONTAINS "X", arbitraryData IS OF TYPE
        // ArbitraryDataTypeX, AND IF "Y" arbitraryData IS OF TYPE
        // ArbitraryDataTypeY?
        arbitraryData <- map["arbitraryData"]
    }
}

class ArbitraryDataTypeX : Mapping {
    var value = "BLA"

    init?(_ map: Map) {
        self.init()
        mapping(map)
    }

    func mapping(map: Map) {
        value <- map["value"]
    }
}

class ArbitraryDataTypeY : Mapping {
    var anotherValue = "BLUBB"

    init?(_ map: Map) {
        self.init()
        mapping(map)
    }

    func mapping(map: Map) {
        anotherValue <- map["anotherValue"]
    }
}

背景信息:我正在使用 AlamofireObjectMapper 与后端服务器通信。其中一个请求的结果是一个 Item 数组。 typeIdentifier-mechanism(事实上它有点复杂,但让我们忽略它)由后端提供并且无法更改。

好的,我找到了解决办法(不知道为什么一开始没看到):

// This is Item.map()
func mapping(map: Map) {
    typeIdentifier <- map["typeIdentifier"]

    switch typeIdentifier {
    case "X":
        let x: X?
        x <- map["arbitraryData"]
        arbitraryData = x
    case "Y":
        let y: Y?
        y <- map["arbitraryData"]
        arbitraryData = y
    default:
        arbitraryData = nil
    }
}