JSON 使用 Alamofire 建模的数组
JSON Array to model using Alamofire
我正在创建一个 UITableView,它将在每个单元格中显示此响应。
问题是,我不知道如何解析对模型的响应。
这是 api
的回复
[
"electronics",
"jewelery",
"men's clothing",
"women's clothing"
]
这是 ViewController
的代码
class HomeViewController: UIViewController {
@IBOutlet var tableView: UITableView!
var category: [Category] = []
override func viewDidLoad() {
super.viewDidLoad()
tableView.delegate = self
tableView.dataSource = self
guard let url = URL(string: "\(Constants.url.baseUrl)\(Constants.url.category)") else {
return
}
AF.request(url).responseDecodable(of: [Category].self) { response in
guard let categories = response.value else {
return
}
DispatchQueue.main.async { [weak self] in
self?.tableView.reloadData()
}
}
}
}
extension HomeViewController: UITableViewDataSource, UITableViewDelegate {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
print("category count", category.count)
return category.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
guard let cell = tableView.dequeueReusableCell(withIdentifier: Constants.identifiers.categoryTableViewCell) as? CategoryTableViewCell else{
return UITableViewCell()
}
cell.configureTableViewCell(with: self.category[indexPath.row])
return cell
}
}
这是我的模型
struct Category: Codable {
}
如有任何帮助,我将不胜感激。先谢谢你了!
这是您问题的答案...
因此您的模型 class 将如下所示:
import Foundation
struct Category: Codable {
enum CodingKeys: String, CodingKey {
}
init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
}
}
现在您可以使用它作为以下三种方法之一来解析数据:
1.Using 可编码映射:
let url = URL(string: "http://www.google.com")
let task = URLSession.shared.dataTask(with: url!) { (data, response, error) in
let jsonDecoder = JSONDecoder()
let responseModel = try jsonDecoder.decode(Category.self, from: data!)
}
task.resume()
2.Using ObjectMapper
// Convert JSON String to Model
let responseModel = Mapper<Category>().map(JSONString: JSONString)
// Create JSON String from Model
let JSONString = Mapper().toJSONString(responseModel, prettyPrint: true)
3.Using字典映射
let url = URL(string: "http://www.google.com")
let task = URLSession.shared.dataTask(with: url!) { (data, response, error) in
let someDictionaryFromJSON = try JSONSerialization.jsonObject(with:
data, options: .allowFragments) as! [String: Any]
let category = Category(someDictionaryFromJSON)
}
task.resume()
如果你真的想要一个模型class然后按照已经建议的那样解码成一个字符串数组,然后将结果映射到你的模型
struct Category {
let name: String
}
AF.request(url).responseDecodable(of: [String].self) { response in
guard let categories = response.value else {
return
}
DispatchQueue.main.async { [weak self] in
self.category = categories.map(Category.init)
self?.tableView.reloadData()
}
}
我正在创建一个 UITableView,它将在每个单元格中显示此响应。 问题是,我不知道如何解析对模型的响应。
这是 api
的回复[
"electronics",
"jewelery",
"men's clothing",
"women's clothing"
]
这是 ViewController
的代码class HomeViewController: UIViewController {
@IBOutlet var tableView: UITableView!
var category: [Category] = []
override func viewDidLoad() {
super.viewDidLoad()
tableView.delegate = self
tableView.dataSource = self
guard let url = URL(string: "\(Constants.url.baseUrl)\(Constants.url.category)") else {
return
}
AF.request(url).responseDecodable(of: [Category].self) { response in
guard let categories = response.value else {
return
}
DispatchQueue.main.async { [weak self] in
self?.tableView.reloadData()
}
}
}
}
extension HomeViewController: UITableViewDataSource, UITableViewDelegate {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
print("category count", category.count)
return category.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
guard let cell = tableView.dequeueReusableCell(withIdentifier: Constants.identifiers.categoryTableViewCell) as? CategoryTableViewCell else{
return UITableViewCell()
}
cell.configureTableViewCell(with: self.category[indexPath.row])
return cell
}
}
这是我的模型
struct Category: Codable {
}
如有任何帮助,我将不胜感激。先谢谢你了!
这是您问题的答案...
因此您的模型 class 将如下所示:
import Foundation
struct Category: Codable {
enum CodingKeys: String, CodingKey {
}
init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
}
}
现在您可以使用它作为以下三种方法之一来解析数据:
1.Using 可编码映射:
let url = URL(string: "http://www.google.com")
let task = URLSession.shared.dataTask(with: url!) { (data, response, error) in
let jsonDecoder = JSONDecoder()
let responseModel = try jsonDecoder.decode(Category.self, from: data!)
}
task.resume()
2.Using ObjectMapper
// Convert JSON String to Model
let responseModel = Mapper<Category>().map(JSONString: JSONString)
// Create JSON String from Model
let JSONString = Mapper().toJSONString(responseModel, prettyPrint: true)
3.Using字典映射
let url = URL(string: "http://www.google.com")
let task = URLSession.shared.dataTask(with: url!) { (data, response, error) in
let someDictionaryFromJSON = try JSONSerialization.jsonObject(with:
data, options: .allowFragments) as! [String: Any]
let category = Category(someDictionaryFromJSON)
}
task.resume()
如果你真的想要一个模型class然后按照已经建议的那样解码成一个字符串数组,然后将结果映射到你的模型
struct Category {
let name: String
}
AF.request(url).responseDecodable(of: [String].self) { response in
guard let categories = response.value else {
return
}
DispatchQueue.main.async { [weak self] in
self.category = categories.map(Category.init)
self?.tableView.reloadData()
}
}