使用 ObjectMapper 的不同类型 JSON 文件
Different types JSON file using ObjectMapper
我正在使用 AlamofireObjectMapper 与后端服务器通信。其中一个请求的结果是一个项目数组,其中包含两个值:
- 一个"typeIdentifier"表示第二个值("arbitraryData")是什么类型的数据
- 一个"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(事实上它有点复杂,但让我们忽略它)由后端提供并且无法更改。
好的,我找到了解决办法(不知道为什么一开始没看到):
// 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
}
}
我正在使用 AlamofireObjectMapper 与后端服务器通信。其中一个请求的结果是一个项目数组,其中包含两个值:
- 一个"typeIdentifier"表示第二个值("arbitraryData")是什么类型的数据
- 一个"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(事实上它有点复杂,但让我们忽略它)由后端提供并且无法更改。
好的,我找到了解决办法(不知道为什么一开始没看到):
// 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
}
}