使用ObjectMapper的不同类型的JSON文件

时间:2016-04-20 10:21:56

标签: json swift subclass alamofire objectmapper

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

  • A" typeIdentifier"指示第二个值(" arbitraryData")是
  • 的数据类型
  • A"任意数据":
    • 如果" typeIdentifier" CONTAINS" X",arbitraryData的类型为ArbitraryDataTypeX
    • 如果" typeIdentifier" CONTAINS" Y",arbitraryData的类型为ArbitraryDataTypeY

两个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(事实上它有点复杂,但让我们把它留下来)由后端给出,不能改变。

1 个答案:

答案 0 :(得分:0)

好的,我找到了一个解决方案(我不知道为什么我从一开始就没有看到它):

// 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
    }
}