Swift 无法读取数据,因为它的格式不正确

Posted

技术标签:

【中文标题】Swift 无法读取数据,因为它的格式不正确【英文标题】:Swift The data couldn’t be read because it isn’t in the correct format 【发布时间】:2021-05-25 21:28:28 【问题描述】:

我是 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


  "latest_photos": [
    
      "id": 839114,
      "sol": 3127,
      "camera": 
        "id": 20,
        "name": "FHAZ",
        "rover_id": 5,
        "full_name": "Front Hazard Avoidance Camera"
      ,
      "img_src": "https://mars.nasa.gov/msl-raw-images/proj/msl/redops/ods/surface/sol/03127/opgs/edr/fcam/FRB_675093431EDR_F0880366FHAZ00302M_.JPG",
      "earth_date": "2021-05-23",
      "rover": 
        "id": 5,
        "name": "Curiosity",
        "landing_date": "2012-08-06",
        "launch_date": "2011-11-26",
        "status": "active"
      
    ,
    
      "id": 839115,
      "sol": 3127,
      "camera": 
        "id": 20,
        "name": "FHAZ",
        "rover_id": 5,
        "full_name": "Front Hazard Avoidance Camera"
      ,
      "img_src": "https://mars.nasa.gov/msl-raw-images/proj/msl/redops/ods/surface/sol/03127/opgs/edr/fcam/FLB_675093431EDR_F0880366FHAZ00302M_.JPG",
      "earth_date": "2021-05-23",
      "rover": 
        "id": 5,
        "name": "Curiosity",
        "landing_date": "2012-08-06",
        "launch_date": "2011-11-26",
        "status": "active"
      
    
  ]


【问题讨论】:

【参考方案1】:

您的 JSON 格式与您尝试解码的格式不完全匹配。您需要一个用于 JSON 对象根目录的 latest_photos 数组的包装器。

例如:

struct LatestPhotosWrapper: Codable 
    let latestPhotos: [LatestPhoto]
    
    enum CodingKeys: String, CodingKey 
        case latestPhotos = "latest_photos"
    

let apod = try JSONDecoder().decode(LatestPhotosWrapper.self, from: data)

(除了提供CodingKey,您还可以查看用于从蛇盒转换的内置系统:https://developer.apple.com/documentation/foundation/jsondecoder/keydecodingstrategy/convertfromsnakecase)

此外,您可能想要打印error 而不仅仅是error.localizedDescription——您可以更好地了解正在发生的事情。例如,使用您的原始代码,您会得到:

本应解码 Array 但找到了字典。

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

【讨论】:

现在可以使用了。非常感谢您的帮助。

以上是关于Swift 无法读取数据,因为它的格式不正确的主要内容,如果未能解决你的问题,请参考以下文章

Swift 中的 JSON 解码。无法读取数据,因为它的格式不正确

Swift/MySql/PHP - “无法读取数据,因为它的格式不正确。”错误

Swift iOS Intent 扩展:无法读取数据,因为它的格式不正确

在 Swift 4 中使用新的 JSONDecoder 协议时,我得到“无法读取数据,因为它的格式不正确。”错误

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

无法读取数据,因为它的格式不正确 Xcode 11