gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 12:19:51 25 4
gpt4 key购买 nike

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

}

最佳答案

实现这些类型的复杂json的最佳方式是将每个子类别拆分为不同的对象,并使它们符合协议(protocol)可映射。然后解析该函数​​内的值。请参阅解析了 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"]

}

关于ios - 如何使用 alamofire 对象映射器解析复杂数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44922477/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com