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

Ios 如何使用alamofire对象映射器解析复杂数据?,ios,swift,alamofire,objectmapper,Ios,Swift,Alamofire,Objectmapper,我正在尝试使用Alamofire对象映射器解析JOSN数据..完成了一些基本的工作,但遇到了一些复杂的问题,如 1.如何访问“设置\数据”中的值?(哪种是访问嵌套对象的最佳方式) 2.我可以在哪里定义.GET、.POST方法类型以及应该在哪里传递参数?就像我们写的普通alamofire请求一样 Alamofire.request(url, method: .get, parameters: nil, encoding: JSONEncoding.default) .r

我正在尝试使用Alamofire对象映射器解析JOSN数据..完成了一些基本的工作,但遇到了一些复杂的问题,如

1.如何访问“设置\数据”中的值?(哪种是访问嵌套对象的最佳方式)

2.我可以在哪里定义.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"
    }]
}
模型类-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"]
    }
}
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)
            }
        }
    }

}
<代码>导入基础 导入对象映射器 类项目:NSObject,可映射{ var-projectd:Int? var accountId:Int? var-dateCreated:Int? var-dateModified:Int? 变量名称:字符串? 变量状态:字符串? 重写init(){ super.init() } 便利性要求初始化?(映射:映射){ self.init() } func映射(映射:映射){
projectId实现这些类型的复杂json的最佳方法是将每个子类别拆分为不同的对象,并使它们符合协议可映射性。然后解析该函数中的值。请参见使用time_格式和已解析时区的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"]
}
}
<代码>导入基础 导入对象映射器 类项目:NSObject,可映射{ var-projectd:Int? var accountId:Int? var-dateCreated:Int? var-dateModified:Int? 变量名称:字符串? 变量状态:字符串? 变量设置:设置模型? 重写init(){ super.init() } 便利性要求初始化?(映射:映射){ self.init() } func映射(映射:映射){
projectId为什么不阅读文档?谢谢你的帮助…我有一个问题,我们是否需要为每个对象创建这样的多个类..如果我们有50个这样的API,每个都有50个不同的对象,就像上面所说的那样呢?这个场景有没有更好的架构?如果你不想创建对象,那么你的响应对象将变得非常简单y大,管理起来非常困难。分离每个实体是实现这一点的一种更模块化的方法。如果你不想创建对象,你可以解析时区之类的值。我已经用后面的方法更新了答案。请检查谢谢Arvind。你能指导我们应该在哪里编写。GET和。POSt方法吗?对不起,我没有明白了,你能再详细一点吗?
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"]

            }