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

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)

你能帮我做/理解做函数映射吗?谢谢

And*_*izá 0

我假设您根本没有得到任何值,因为我尝试了您的代码但什么也没得到。如果您只需要 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,那么您需要创建一个具有datapagination属性的新对象,并更改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)