Json Swift无法读取数据’;因为它是’;格式正确

Json Swift无法读取数据’;因为它是’;格式正确,json,swift,Json,Swift,我是swift的新手,正在尝试找出如何将JSON解析为结构。我正在尝试从NASA Mar的漫游者照片中获取图像。我正在尝试在线学习教程,但似乎无法解决此问题。我做错了什么 错误: 致命错误:无法读取数据,因为它的格式不正确 import Foundation class API { class func getImage(_ onSucessus: @escaping ([LatestPhoto]) -> ()){ Constrant.session.dataTa

我是swift的新手,正在尝试找出如何将JSON解析为结构。我正在尝试从NASA Mar的漫游者照片中获取图像。我正在尝试在线学习教程,但似乎无法解决此问题。我做错了什么

错误:

致命错误:无法读取数据,因为它的格式不正确

import Foundation

class API {
    class func getImage(_ onSucessus: @escaping ([LatestPhoto]) -> ()){
        Constrant.session.dataTask(with: Constrant.request){(data, res, err) in
            guard let data = data, err == nil else{
                fatalError()
            }
            do{
                let apod = try Constrant.decoder.decode([LatestPhoto].self, from: data)
                DispatchQueue.main.async {
                    onSucessus(apod)
                }
            }
            catch{
                fatalError(error.localizedDescription)
            }
            
        }.resume()
        
    }
}
结构

struct LatestPhoto: Identifiable, Codable{
    let id = UUID()
    let imgSrc: String
    let earthDate: String

    enum CodingKeys: String, CodingKey {
        case imgSrc = "img_src"
        case earthDate = "earth_date"
      
    }
}

JSON


您的JSON格式与您试图解码的内容不太匹配。您需要在JSON对象的根目录下为
最新的\u照片
数组提供一个包装器

例如:

struct LatestPhotosWrapper: Codable {
    let latestPhotos: [LatestPhoto]
    
    enum CodingKeys: String, CodingKey {
        case latestPhotos = "latest_photos"
    }
}
(除了提供
CodingKey
,您还可以查看用于从snake-case转换的内置系统:)

此外,您可能希望打印
错误
,而不仅仅是
错误。localizedDescription
——您可以更好地了解正在发生的事情。例如,使用原始代码,您可以获得:

应解码数组,但找到了字典


最后,您可以查看app.quicktype.io——您可以粘贴JSON并获得为您预先构建的正确Swift结构。

现在就可以了。非常感谢你的帮助。
struct LatestPhotosWrapper: Codable {
    let latestPhotos: [LatestPhoto]
    
    enum CodingKeys: String, CodingKey {
        case latestPhotos = "latest_photos"
    }
}
let apod = try JSONDecoder().decode(LatestPhotosWrapper.self, from: data)