簡體   English   中英

無法在 Swift 中讀取數據

[英]The data couldn’t be read in Swift

我是 swift 的新手。 我正在嘗試從 api 中檢索數據。 json 格式的數據。 這是 json 格式的數據。

    {
        "photos": [
            {
                "id": 424926,
                "sol": 1000,
                "camera": {
                    "id": 22,
                    "name": "MAST",
                    "rover_id": 5,
                    "full_name": "Mast Camera"
                },
                "img_src": "http://mars.jpl.nasa.gov/msl-raw-images/msss/01000/mcam/1000ML0044631200305217E01_DXXX.jpg",
                "earth_date": "2015-05-30",
                "rover": {
                    "id": 5,
                    "name": "Curiosity",
                    "landing_date": "2012-08-06",
                    "launch_date": "2011-11-26",
                    "status": "active"
                }
            }
    ]

}

這是在線 Json 查看器。

截屏

NetworkMnager code .


    class NetworkManager{
        
        
        func fetchData(completion: @escaping ([Rover]) -> Void) {
           
            
            if let url = URL(string: "https://api.nasa.gov/mars-photos/api/v1/rovers/curiosity/photos?sol=1000&api_key=Mykey") {
                
                URLSession.shared.dataTask(with: url) { data, urlResponse, error in
                    
                    if let data = data {
                        
                        do {
                            let result = try JSONDecoder().decode([Rover].self, from: data)
                            completion(result)
                        } catch let error {
                            print(error.localizedDescription)
                        }
                        
                        
                    }
                    
                }
                .resume()
            }
            
            
        }
    }
    

當我嘗試運行數據時,我試圖將來自流動站(結構)的數據 id 和狀態顯示到模擬器中,我在 xcode 的控制台 window 中收到以下錯誤。 無法讀取數據,因為它的格式不正確。 我確定結構有問題。 這是結構代碼。

        import Foundation

// MARK: - Welcome
struct Welcome: Codable {
    let photos: [Photo]
}

// MARK: - Photo
struct Photo: Codable {
    let id, sol: Int
    let camera: Camera
    let imgSrc: String
    let earthDate: String
    let rover: Rover

    enum CodingKeys: String, CodingKey {
        case id, sol, camera
        case imgSrc = "img_src"
        case earthDate = "earth_date"
        case rover
    }
}

// MARK: - Camera
struct Camera: Codable {
    let id: Int
    let name: String
    let roverID: Int
    let fullName: String

    enum CodingKeys: String, CodingKey {
        case id, name
        case roverID = "rover_id"
        case fullName = "full_name"
    }
}

// MARK: - Rover
struct Rover: Codable {
    let id: Int
    let name, landingDate, launchDate, status: String

    enum CodingKeys: String, CodingKey {
        case id, name
        case landingDate = "landing_date"
        case launchDate = "launch_date"
        case status
    }
}

表格查看 controller 代碼。

class ViewController: UIViewController {
    
    @IBOutlet weak var tableView: UITableView!
    private var posts = [Rover]()
    private let networkManager = NetworkManager()
    private var rowSelected = 0
  
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        
        setUpUI ()
        fetchData()
    }
    
   /* override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "showDetail" {
            let destination = segue.destination as? SecondViewController
            destination?.posts = posts
            destination?.rowSelected = rowSelected
        }
    }*/
    
    private func setUpUI () {
        tableView.dataSource = self
        tableView.delegate = self
    }
    
    private func fetchData() {
        networkManager.fetchData { [weak self] array in
            self?.posts = array
            
            DispatchQueue.main.async {
                self?.tableView.reloadData()
            }
            
        }
    }
}
extension ViewController: UITableViewDelegate {
    
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        rowSelected = indexPath.row
        performSegue(withIdentifier: "cell", sender: nil)
    }
}

extension ViewController: UITableViewDataSource {
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return posts.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        
        let row = indexPath.row
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
        let post = posts[row]
        cell.textLabel?.text = String(post.id)
        cell.detailTextLabel?.text = post.status
        return cell
        
    }
    
}

嘗試使用此示例代碼解碼您的 json 數據:(注意我沒有api_key ,所以我無法對此進行測試)。

編輯-1:

這是我用於測試的代碼(對不起,它使用的是 SwiftUI),從這里你應該能夠解碼你的數據。 為我工作。

class NetworkManager {
    
    func fetchData(completion: @escaping ([Photo]) -> Void) { // <-- here
        if let url = URL(string: "https://api.nasa.gov/mars-photos/api/v1/rovers/curiosity/photos?sol=1000&api_key=YOURKEY") {
            URLSession.shared.dataTask(with: url) { data, urlResponse, error in
                if let data = data {
                    do {
                        let result = try JSONDecoder().decode(NASAResponse.self, from: data) // <-- here
                        completion(result.photos)
                    } catch let error {
                        print(error.localizedDescription)
                    }
                }
            }
            .resume()
        }
    }
}

struct ContentView: View {
    let networkManager = NetworkManager()
    
    @State var photos: [Photo] = []
    
    var body: some View {
        List (photos) { photo in
          HStack {
            Text(String(photo.rover.id))
            Text(photo.rover.status.rawValue)
          }
        }
        .onAppear {
            networkManager.fetchData { thePhotos in
                photos = thePhotos
            }
        }
    }
    
}


struct NASAResponse: Codable {
    let photos: [Photo]
}

// MARK: - Photo
struct Photo: Identifiable, Codable {
    let sol, id: Int
    let earthDate: String
    let camera: Camera
    let imgSrc: String
    let rover: Rover

    enum CodingKeys: String, CodingKey {
        case sol, id
        case earthDate = "earth_date"
        case camera
        case imgSrc = "img_src"
        case rover
    }
}

// MARK: - Camera
struct Camera: Identifiable, Codable {
    let id, roverID: Int
    let fullName: FullName
    let name: CameraName

    enum CodingKeys: String, CodingKey {
        case id
        case roverID = "rover_id"
        case fullName = "full_name"
        case name
    }
}

enum FullName: String, Codable {
    case chemistryAndCameraComplex = "Chemistry and Camera Complex"
    case frontHazardAvoidanceCamera = "Front Hazard Avoidance Camera"
    case mastCamera = "Mast Camera"
    case navigationCamera = "Navigation Camera"
    case rearHazardAvoidanceCamera = "Rear Hazard Avoidance Camera"
}

enum CameraName: String, Codable {
    case chemcam = "CHEMCAM"
    case fhaz = "FHAZ"
    case mast = "MAST"
    case navcam = "NAVCAM"
    case rhaz = "RHAZ"
}

// MARK: - Rover
struct Rover: Identifiable, Codable {
    let status: Status
    let id: Int
    let landingDate, launchDate: String
    let name: RoverName

    enum CodingKeys: String, CodingKey {
        case status, id
        case landingDate = "landing_date"
        case launchDate = "launch_date"
        case name
    }
}

enum RoverName: String, Codable {
    case curiosity = "Curiosity"
}

enum Status: String, Codable {
    case active = "active"
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM