Swift - 嵌套对象的映射(Objectmapper)

时间:2017-11-15 21:05:28

标签: json swift mapping alamofire objectmapper

我正在使用Swift 4开发一个应用程序。我用Alamofire调用APIRest,我想用Objectmapper映射JSON响应。好吧,给我回电话的JSON如下:

enter image description here

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"]
    }

}

你能帮我做/理解功能映射吗?感谢

1 个答案:

答案 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节点中的信息,那么您需要创建一个具有datapagination属性的新对象,并更改{{ 1}}使用responseArray(keyPath: ...)中的新根对象简单地responseObject

然后我相信你只想要DataResponse的uri,所以我建议在你的模型中使用一个String来存储它,而不是一个链接数组。假设链接数组未排序并且可能在将来更改顺序(如果不能直接访问,如runs并且您已完成),则需要解析所有链接然后进行过滤。它可以按如下方式完成:

map["links.1.uri"]