【问题标题】:Different types JSON file using ObjectMapper使用 ObjectMapper 的不同类型的 JSON 文件
【发布时间】:2016-04-20 10:21:56
【问题描述】:

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

  • “typeIdentifier”指示第二个值(“arbitraryData”)属于哪种类型的数据
  • “任意数据”:
    • 如果“typeIdentifier”包含“X”,则arbitraryData的类型为ArbitraryDataTypeX
    • 如果“typeIdentifier”包含“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(实际上它有点复杂,但我们忽略它)由后端提供,无法更改。

【问题讨论】:

  • 您要回答的问题是什么?
  • 对不起,这确实不清楚。我编辑了问题。

标签: json swift subclass alamofire objectmapper


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-13
    • 1970-01-01
    • 1970-01-01
    • 2020-01-12
    相关资源
    最近更新 更多