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