使用 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 数据的主要内容,如果未能解决你的问题,请参考以下文章

从 URLRequest dataTask 返回泛型类型

Swift 使用Codable协议进行json转模型

使用 RxSwift 和 URLSession 处理 401 状态

如何使用 Codable 和 Swift 解析这个嵌套的 JSON?

如何一起使用Codable和Coredata?

使用 Alamofire/Codable 解析 JSON 行