Had*_*seh 1 xcode json ios swift
我使用 URLSession 解析 JSON 并将其映射到 Codable ,但我无法在 JSON 数据内部获取结果数组以在表视图中显示它。我的问题是如何获取结果并从中创建一个对象以在表视图中使用。
JSON 数据:
{
"result": [
{
"Id": 5,
"Title": "test",
"EnTitle": "Story and Novel"
},
{
"Id": 38,
"Title": "test",
"EnTitle": " Motivational"
}
],
"status": {
"httpStatusCode": 200
}
}
Run Code Online (Sandbox Code Playgroud)
JSON 模型:
struct Result : Decodable {
let status: status
let result: result
}
struct status : Decodable {
let httpStatusCode: Int
}
struct result : Decodable {
let Id: Int
let Title: String
let EnTitle: String
}
Run Code Online (Sandbox Code Playgroud)
视图控制器:
override func viewDidLoad() {
super.viewDidLoad()
gettingData()
}
func gettingData(){
let url = URL(string: URL)!
let session = URLSession.shared
var request = URLRequest(url: url)
request.addValue("c9d5f944", forHTTPHeaderField: "X-test")
let task = session.dataTask(with: request as URLRequest, completionHandler: { data, response, error in
guard error == nil else {
return
}
guard let data = data else {
return
}
do {
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
let response = try decoder.decode(Result.self, from: data)
print(response)
} catch {
print(error)
}
})
task.resume()
}
Run Code Online (Sandbox Code Playgroud)
1-result键是一个数组let result: [Result]
// MARK: - Empty
struct Root: Codable {
let result: [Result]
let status: Status
}
// MARK: - Result
struct Result: Codable {
let id: Int
let title, enTitle: String
enum CodingKeys: String, CodingKey {
case id = "Id"
case title = "Title"
case enTitle = "EnTitle"
}
}
// MARK: - Status
struct Status: Codable {
let httpStatusCode: Int
}
Run Code Online (Sandbox Code Playgroud)
2-分配数组并重新加载表
do {
let decoder = JSONDecoder()
let response = try decoder.decode(Root.self, from: data)
self.allRes = response.result
DispatchQueue.main.async {
self.tableView.reloadData()
}
} catch {
print(error)
}
Run Code Online (Sandbox Code Playgroud)
3-表数据源方法
var allRes = [Result]() // add this var
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return allRes.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as! CustomCell
let item = allRes[indexPath.row]
// configure cell here
return cell
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5958 次 |
| 最近记录: |