使用 URLSession 和 Codable 解析 JSON 数据

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)

Sh_*_*han 6

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)