我正在尝试使用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)
}
}
}
}
答案 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"]
}