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

标签 json swift subclass alamofire objectmapper

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

  • 指示第二个值(“任意数据”)属于哪种数据类型的“typeIdentifier”
  • “任意数据”:
    • 如果“typeIdentifier”包含“X”,则任意数据的类型为 ArbitraryDataTypeX
    • 如果“typeIdentifier”包含“Y”,则任意数据的类型为 ArbitraryDataTypeY

这两个 ArbitraryDataType 类不共享任何共同的祖先(Mappable 除外)。它甚至可以是原始类型、数组、可选类型等。

如何使 AlamofireObjectMapper 使用适当的类型解析“任意数据”字段。

请参阅以下 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 机制(实际上有点复杂,但我们先不考虑这个)是由后端给出的,无法更改。

最佳答案

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

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

关于json - 使用 ObjectMapper 的不同类型 JSON 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36740831/

相关文章:

java - 如何判断一个 JSON 模式与 Java 中的另一个模式兼容?

java - JSON jsonObject.optString() 返回字符串 "null"

python - 当子类用 __init__() 调用 super() 时,父类(super class)的对象在哪里/什么?

ios - 从 Swift 函数中的异步调用返回数据

java - 将 Builder 扩展/子类化到直接子级之外

ios6 - ios UIButton 子类可重用 Storyboard 中的按钮

java - 我们可以一起使用内容类型八位字节流和 json 吗?

java - 如何使用java将json对象转换为mongodb中的文档

android - 将 iOS 框架 (Swift/Objective-C) 导入到 Android 应用程序项目中?

ios - 分子量计算器中的枚举