Jor*_*nau 6 mapping json swift alamofire objectmapper
我正在用 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()
}
})
}
Run Code Online (Sandbox Code Playgroud)
问题是我不知道如何访问每个值(func 映射)。因为有一些嵌套值。除此之外,一些通告是对象,其他通告是数组。我的错误代码如下:
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"]
}
}
Run Code Online (Sandbox Code Playgroud)
你能帮我做/理解做函数映射吗?谢谢
我假设您根本没有得到任何值,因为我尝试了您的代码但什么也没得到。如果您只需要 json 中的数组内容data,并且正如您现在所拥有的那样,ObjectMapper 需要一个仅包含PostModelSpeedRunModels. 因此,您需要添加一个keyPath来告诉 AlamofireObjectMapper 它的起点:
Alamofire.request("http://www.speedrun.com/api/v1/games", method: .get)
.responseArray(keyPath: "data") { (response: DataResponse<[PostModelSpeedRunModel]>) in
...
}
Run Code Online (Sandbox Code Playgroud)
如果您还需要来自节点的信息pagination,那么您需要创建一个具有data和pagination属性的新对象,并更改responseArray(keyPath: ...)为仅responseObject使用 中的新根对象DataResponse。
那么我相信您只需要runs的 uri,因此我建议您在模型中只使用一个字符串来存储它,而不是链接数组。假设链接数组是未排序的,并且将来可能会改变顺序(如果没有,你可以直接访问,这样就map["links.1.uri"]完成了),所有链接都需要解析然后过滤。可以按如下方式完成:
struct PostModelSpeedRunModel {
var id = ""
var international = ""
var abbreviation = ""
var runsLink = ""
var uri = ""
}
extension PostModelSpeedRunModel: Mappable {
init?(map: Map) {
}
mutating func mapping(map: Map) {
id <- map["id"]
international <- map["international"]
abbreviation <- map["abbreviation"]
uri <- map["logo"]
var links: [Link]?
links <- map["links"]
if let uri = links?.first(where: {$0.rel == "runs"})?.uri {
runsLink = uri
}
}
}
struct Link {
var rel = ""
var uri = ""
}
extension Link: Mappable {
init?(map: Map) {
}
mutating func mapping(map: Map) {
rel <- map["rel"]
uri <- map["uri"]
}
}
Run Code Online (Sandbox Code Playgroud)