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

时间:2017-07-05 09:38:44

标签: ios swift alamofire objectmapper

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

1.如何在" settings_data"中访问值? (这是访问嵌套对象的最佳方式)

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

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)
            }
        }
    }

}

1 个答案:

答案 0 :(得分:0)

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

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

            }