Ios 如何使用alamofire对象映射器解析复杂数据?
我正在尝试使用Alamofire对象映射器解析JOSN数据..完成了一些基本的工作,但遇到了一些复杂的问题,如 1.如何访问“设置\数据”中的值?(哪种是访问嵌套对象的最佳方式) 2.我可以在哪里定义.GET、.POST方法类型以及应该在哪里传递参数?就像我们写的普通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.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"]
}