Ios 数据无法’;因为它是’;t格式正确。斯威夫特5
我正在试着从中解码数据。我得到了正确的json,响应代码为200,但解码器无法读取数据,因为格式不正确。我尝试了很多不同的方法。我正在尝试获取有关人类的信息 这是我的密码: 模型文件Ios 数据无法’;因为它是’;t格式正确。斯威夫特5,ios,json,swift,api,jsondecoder,Ios,Json,Swift,Api,Jsondecoder,我正在试着从中解码数据。我得到了正确的json,响应代码为200,但解码器无法读取数据,因为格式不正确。我尝试了很多不同的方法。我正在尝试获取有关人类的信息 这是我的密码: 模型文件 struct people: Codable { let count: Int let next: String? let previous: String? let results: [result] } struct result: Codable{ let name:
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)
}
}
首先,您的数据无法读取,因为在星球大战API中,
height
和mass
表示为String
,而在Codable
结构中则表示为Int
另外,尝试将CodingKeys
添加到Codable
结构中,使结构遵守命名约定(特别是关于属性的颜色
变体),例如
提示:将生成的JSON粘贴到中,以获得生成的模型结构,而不是打印
错误。localizedDescription
在JSONDecoder
catch块中,错误消息毫无意义。打印错误
,它会显示真正可理解的错误。在JSON中,用双引号括起来的所有内容都是字符串
偶数“123”
或“false”
。谢谢!我改成了字符串,现在可以使用了。或者,如果映射像这样简单,可以使用JSONDecoder.KeyDecodingStrategy.convertFromSnakeCase
。将类型更改为字符串。
struct result: Codable{
let name: String
let height: String
let mass: String
let hairColor: String // changed from hair_color
let skinColor: String
let eyeColor: String
let birthYear: 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
enums CodingKeys: String, CodingKey {
case name = "name"
case height = "height"
case mass = "mass"
case hairColor = "hair_color"
case skinColor = "skin_color"
case eyeColor = "eye_color"
case birthYear = "birth_year"
case gender = "gender"
case homeworld = "homeworld"
case films = "films"
case species = "species"
case vehicles = "vehicles"
case starships = "starships"
case created = "created"
case edited = "edited"
case url = "url"
}
}