Ios 数据无法’;因为它是’;t格式正确。斯威夫特5

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:

我正在试着从中解码数据。我得到了正确的json,响应代码为200,但解码器无法读取数据,因为格式不正确。我尝试了很多不同的方法。我正在尝试获取有关人类的信息

这是我的密码:

模型文件

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" 
    }
}