【发布时间】:2021-05-04 07:59:16
【问题描述】:
我正在尝试解码来自https://swapi.dev/ 的数据。我使用响应代码 200 正确获取 json,但解码器无法读取数据,因为格式不正确。我尝试了很多不同的方式。我正在尝试获取有关人员的信息。
这是我的代码:
模型文件
struct people: Codable {
let count: Int
let next: String?
let previous: String?
let results: [result]
}
struct result: Codable{
let name: String
let height: Int
let mass: Int
let hair_color: String
let skin_color: String
let eye_color: String
let birth_year: String
let gender: String
let homeworld: String
let films: [String]
let species: [String]
let vehicles: [String]
let starships: [String]
let created: String
let edited: String
let url: String
}
struct APIError: Codable {
let detail: String
}
网络服务
typealias OnApiSucces = (people) -> Void
typealias OnApiError = (String) -> Void
struct ApiService {
static let shared = ApiService()
let URL_BASE = "https://swapi.dev/api"
let URL_PEOPLE = "/people"
let session = URLSession(configuration: .default)
func getResults(onSuccess: @escaping OnApiSucces, onError: @escaping OnApiError) {
let url = URL(string: "\(URL_BASE)\(URL_PEOPLE)")!
var request = URLRequest(url: url)
request.httpMethod = "GET" // GET, PUT, POST, DELETE for some different api
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
let task = session.dataTask(with: request) { (data, response, error) in
if let error = error {
onError(error.localizedDescription)
return
}
guard let data = data, let response = response as? HTTPURLResponse else {
onError("Invalid data or response")
return
}
do{
if response.statusCode == 200 {
print("Code is \(response.statusCode)")
let results = try JSONDecoder().decode(people.self, from: data)
onSuccess(results)
} else {
let err = try JSONDecoder().decode(APIError.self, from: data)
print("Code is \(response.statusCode)")
onError(err.detail)
}
}
catch {
onError(error.localizedDescription)
}
}
task.resume()
}
}
** 在 ViewController 上获取数据**
func getResults() {
ApiService.shared.getResults { (people) in
self.results = people.results
} onError: { (error) in
debugPrint(error.description)
}
}
【问题讨论】:
-
提示:将生成的 JSON 粘贴到 app.quicktype.io 以获取生成的模型结构
-
永远不要在
JSONDecoder捕获块中打印error.localizedDescription,错误消息毫无意义。打印error,它向您展示了真正可理解的错误。在 JSON 中,用双引号括起来的所有内容都是String甚至是"123"或"false"。 -
谢谢!我更改为 String,现在可以使用了。
标签: ios json swift api jsondecoder