如何使用 alamofire 对象映射器解析复杂数据?

How to parse complex data using alamofire object mapper?

我正在尝试使用 Alamofire 对象映射器解析 JOSN 数据。基本的事情已经完成,但遇到了诸如

之类的复杂事情

1.How 我可以访问 "settings_data" 中的值吗? (这是访问嵌套对象的最佳方式)

2.where 我可以定义 .GET、.POST 方法类型以及我们应该在哪里传递参数吗?就像我们写成

的普通 alamofire 请求一样
  Alamofire.request(url, method: .get, parameters: nil, encoding: JSONEncoding.default)
            .responseJSON { response in

有什么好的方法可以达到同样的目的吗?

JOSN 响应

{
    "err": 0,
    "result": [{
        "id": 71930,
        "account_id": 40869,
        "status": "enabled",
        "settings_data": {
            "time_format": "12h",
            "timezone": "US/Pacific",
            "fingerprint_versions": {
                "browser.browser-js": 1
            },
            "integrations": {
                "jira": {},
                "datadog": {},
                "bitbucket": {},
                "github": {},
                "trello": {
                    "board_id": "xxx",
                    "enabled": true,
                    "access_token_user_id": 1234,
                    "list_id": "xxxxx"
                },
                "slack": {
                    "channel_id": "xxxx",
                    "enabled": true,
                    "access_token_user_id": "xx"
                },
                "webhook": {},
                "victorops": {},
                "asana": {},
                "pivotal": {},
                "campfire": {},
                "sprintly": {},
                "pagerduty": {},
                "hipchat": {},
                "email": {
                    "enabled": true
                },
                "flowdock": {}
            }
        },
        "date_created": 1468068105,
        "date_modified": 1493409629,
        "name": "Android_ParentApp"
    }, {
        "id": 71931,
        "account_id": 40869,
        "status": "enabled",
        "settings_data": {
            "time_format": "12h",
            "timezone": "US/Pacific",
            "fingerprint_versions": {
                "browser.browser-js": 1
            },
            "integrations": {
                "jira": {},
                "datadog": {},
                "bitbucket": {},
                "github": {},
                "trello": {
                    "board_id": "xxxx",
                    "enabled": true,
                    "access_token_user_id": 1234,
                    "list_id": "xxxxx"
                },
                "slack": {
                    "channel_id": "xxxxx",
                    "enabled": true,
                    "access_token_user_id": "xxx"
                },
                "webhook": {},
                "victorops": {},
                "asana": {},
                "pivotal": {},
                "campfire": {},
                "sprintly": {},
                "pagerduty": {},
                "hipchat": {},
                "email": {
                    "enabled": true
                },
                "flowdock": {}
            }
        },
        "date_created": 1468068142,
        "date_modified": 1493409658,
        "name": "Android_TeacherApp"
    }]
}

型号Class - Project.swift

import Foundation
import ObjectMapper

class Project: NSObject, Mappable {

    var projectId: Int?
    var accountId: Int?
    var dateCreated: Int?
    var dateModified: Int?
    var name: String?
    var status: String?

    override init() {
        super.init()
    }

    convenience required init?(map: Map) {
        self.init()
    }

    func mapping(map: Map) {
        projectId <- map["id"]
        accountId <- map["account_id"]
        dateCreated <- map["date_created"]
        dateModified <- map["date_modified"]
        name <- map["name"]
        status <- map["status"]
    }
}

ViewController.swift

import UIKit
import Alamofire
import AlamofireObjectMapper

class ViewController: UIViewController {

    var projects:[Project] = []

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        fetchData()

    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    func fetchData(){
        UIApplication.shared.isNetworkActivityIndicatorVisible = true
        let apiUrl = "https://raw.githubusercontent.com/javalnanda/AlamofireObjectMapperSample/master/AOMsample.json"
        Alamofire.request(apiUrl).validate().responseArray(keyPath: "result") { (response: DataResponse<[Project]>) in
            UIApplication.shared.isNetworkActivityIndicatorVisible = false
            switch response.result {
            case .success:
                print(response.result)
                self.projects = response.result.value ?? []
               // print("sss \(self.projects)")

                for project in self.projects {
                    print(  project.name ?? "")
                }
            case .failure(let error):
                print(error)
            }
        }
    }

}

实现这些复杂类型的最佳方法json是将每个子类别拆分为不同的对象,并使它们符合协议可映射。然后解析该函数​​内的值。请参阅带有 time_format 和已解析时区的 SettingsModel 示例。您可以像这样

实现 类 的其余部分
    import Foundation
    import ObjectMapper

    class Project: NSObject, Mappable {

        var projectId: Int?
        var accountId: Int?
        var dateCreated: Int?
        var dateModified: Int?
        var name: String?
        var status: String?
        var settings: SettingsModel?
        override init() {
            super.init()
        }

        convenience required init?(map: Map) {
            self.init()
        }

        func mapping(map: Map) {
            projectId <- map["id"]
            accountId <- map["account_id"]
            dateCreated <- map["date_created"]
            dateModified <- map["date_modified"]
            name <- map["name"]
            status <- map["status"]
            settings <- map["settings_data"]
        }
    }


import UIKit
import ObjectMapper

class SettingsModel: NSObject,Mappable {

     var time_format:String?
     var timezone:String?

     override init() {
        super.init()
    }

    convenience required init?(map: Map) {
        self.init()
    }

    func mapping(map: Map) {
       time_format <- map["time_format"]
       timezone <- map["timezone"]
}
}

如果您不想创建新对象,您可以这样解析

func mapping(map: Map) {
                projectId <- map["id"]
                accountId <- map["account_id"]
                dateCreated <- map["date_created"]
                dateModified <- map["date_modified"]
                name <- map["name"]
                status <- map["status"]
                time_format <- map["settings_data.time_format"]
                timezone <- map["settings_data.timezone"]

            }