繁体   English   中英

Create a model class and access the values from JSON response using Codable in ios swift?

[英]Create a model class and access the values from JSON response using Codable in ios swift?

我正在学习如何创建 model class 并使用 Codable 协议如何访问 JSON 响应的值。 使用 Alamofire 获取 API 调用请求。 这是我的代码

我的 Model class

class User:Codable{
    var topping: [Topping]?
    var name:String?
    var batters:Batter?
    var ppu:Double?
    var type:String?
    var id:Int?
}

class Topping:Codable{
    var type:String?
    var id:Int?
}
class Batter:Codable{
    var batter:[Topping]?
}


class ViewController: UIViewController {

    @IBOutlet weak var userTbl: UITableView!
    var url:String!
    var usersArray : [User] = []

    override func viewDidLoad() {
        super.viewDidLoad()

        url = "http://www.json-generator.com/api/json/get/bQmhSwusoi?indent=2"
        Alamofire.request(url, method: .get, encoding: JSONEncoding.default)
            .responseJSON { response in
                print("response--->",response)
                guard response.data != nil else { return }
                do{
                    self.usersArray = try JSONDecoder().decode([User].self, from: Data(response.data!))
                  self.userTbl.reloadData()
                }catch{
                    print("Failed pass the :\(error)")
                }


        }
    }

}


extension ViewController: UITableViewDelegate,UITableViewDataSource{

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return usersArray.count
    }
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = userTbl.dequeueReusableCell(withIdentifier: "UserCell")
        let bUser = usersArray[indexPath.row]
        // Using bUser how can i get topping and batters values

        return cell ?? UITableViewCell()
    }

我的问题:请查看我的 json 回复并检查我的 model class。我如何访问顶部和击球手值并在 Z188ABBZ561765E2108ABBFE9615765E 中列出提前谢谢。

正如我在评论中所说,您需要从数据中创建一个用户数组,替换这个let jsonResponse = try JSONDecoder().decode(UserArr.self, from: Data(response.data!)) for let userArray: [UserArr] = try JSONDecoder().decode([UserArr].self, from: Data(response.data!))

那么你需要声明一个UserArr model 数组,我将从现在开始将其重命名为User

完整代码

class ViewController: UIViewController {

    @IBOutlet weak var userTbl: UITableView!
    var url:String!
    var usersArray : [User] = []

    override func viewDidLoad() {
        super.viewDidLoad()

        url = "http://www.json-generator.com/api/json/get/bQmhSwusoi?indent=2"
        Alamofire.request(url, method: .get, encoding: JSONEncoding.default)
            .responseJSON { [weak self] response in
                guard let strongSelf = self else {
                   return
                }

                print("response--->",response)
                guard response.data != nil else { return }
                do{
                    strongSelf.usersArray = try JSONDecoder().decode([User].self, from: Data(response.data!))
                    strongSelf.userTbl.reloadData()
                }catch{
                    print("Failed pass the :\(error)")
                }


        }
    }

}

嗨使用 Quicktype 免费在线工具,它非常易于使用 json 解析这是链接,或者您可以选择搜索 quicktype swift,我经常使用这个。

https://quicktype.io/

{// sample from quicktype app online
"greeting": "Welcome to quicktype!",
"instructions": [
"Type or paste JSON here",
"Or choose a sample above",
"quicktype will generate code in your",
"chosen language to parse the sample data"
]
}
// MARK: - Welcome
struct Welcome: Codable {
let greeting: String
let instructions: [String]
}
//   let welcome = try? newJSONDecoder().decode(Welcome.self, from: jsonData)

如果你自己生成它很好。 编码快乐!!!!

最简单的方法是,如果您在cellForRowAt中将属性转换为字符串并在您的单元格中显示它们

let bUser = usersArray[indexPath.row]
let toppings = bUser.topping?.compactMap {$0.type}.joined(separator: ", ")
let batters = bUser.batters?.batter?.compactMap {$0.type}.joined(separator: ", ")

cell.textLabel?.text = "Toppings: \(toppings)\nBatters: \(batters)"

当然,您需要根据单元格的外观调整如何将两个字符串分配给单元格。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM