我正在使用Swift 4开发一个应用程序。我用Alamofire调用APIRest,我想用Objectmapper映射JSON响应。好吧,给我回电话的JSON如下:
APIRest的代码是:
func retrievePostListData() {
Alamofire
.request("http://www.speedrun.com/api/v1/games", method: .get)
.validate()
.responseArray(completionHandler: { (response:
DataResponse<[PostModelSpeedRunModel]>) in
switch response.result {
case .success(let posts):
self.remoteRequestHandler?.onPostsRetrievedData(posts)
case .failure( _):
self.remoteRequestHandler?.onError()
}
})
}
问题是我不知道如何访问每个值(func mapping)。因为有一些嵌套值。除此之外,一些通告是对象,其他是阵列。我的错误代码如下:
import Foundation
import ObjectMapper
struct PostModelSpeedRunModel {
var id = ""
var international = ""
var abbreviation = ""
var links = [Links]??? // I need to get "rel" and "uri" of "runs"
var uri = ""
}
extension PostModelSpeedRunModel: Mappable {
init?(map: Map) {
}
mutating func mapping(map: Map) {
id <- map["data.id"]
international <- map["data.international"]
abbreviation <- map["data.abbreviation"]
link <- map["data.Links"]
uri <- map["data.logo"]
}
}
你能帮我做/理解功能映射吗?感谢
答案 0 :(得分:0)
我假设你根本没有得到任何价值,因为我尝试了你的代码却一无所获。如果您只需要json中的data
数组的内容,并且正如您现在所拥有的那样,那么ObjectMapper期望json只有一个PostModelSpeedRunModels
数组。因此,您需要添加keyPath
来告诉AlamofireObjectMapper它的起点:
Alamofire.request("http://www.speedrun.com/api/v1/games", method: .get)
.responseArray(keyPath: "data") { (response: DataResponse<[PostModelSpeedRunModel]>) in
...
}
如果您还需要pagination
节点中的信息,那么您需要创建一个具有data
和pagination
属性的新对象,并更改{{ 1}}使用responseArray(keyPath: ...)
中的新根对象简单地responseObject
。
然后我相信你只想要DataResponse
的uri,所以我建议在你的模型中使用一个String来存储它,而不是一个链接数组。假设链接数组未排序并且可能在将来更改顺序(如果不能直接访问,如runs
并且您已完成),则需要解析所有链接然后进行过滤。它可以按如下方式完成:
map["links.1.uri"]