使用 URLSession 和 Codable 解析 JSON 数据
Posted
技术标签:
【中文标题】使用 URLSession 和 Codable 解析 JSON 数据【英文标题】:Parsing JSON data with URLSession and Codable 【发布时间】:2019-12-02 12:13:42 【问题描述】:我使用 URLSession 解析 JSON 并使用 Codable 映射它,但我无法在 JSON 数据中获取 result 数组以在表格视图中显示它。我的问题是如何获取 result 并从中制作一个对象以在表格视图中使用。
JSON 数据:
"result": [
"Id": 5,
"Title": "test",
"EnTitle": "Story and Novel"
,
"Id": 38,
"Title": "test",
"EnTitle": " Motivational"
],
"status":
"httpStatusCode": 200
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
视图控制器:
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()
【问题讨论】:
result
应该是一个数组。在struct Result
中作为let result: [result]
。
【参考方案1】:
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
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)
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
【讨论】:
以上是关于使用 URLSession 和 Codable 解析 JSON 数据的主要内容,如果未能解决你的问题,请参考以下文章
使用 RxSwift 和 URLSession 处理 401 状态