You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift JSON解码类型不匹配错误修复及ContentView数据展示方案

解决SwiftUI调用500px API时的JSON解码错误

这个错误明明白白指出:解析current_page字段时,你的代码试图把一个数字解码成数组,直接导致类型不匹配。500px API返回的current_page是个整数(比如1),但你的数据模型里肯定把这个字段错误声明成了数组类型(比如[Int])。

修复步骤:

  1. 修正数据模型的字段类型
    找到你定义的对应API返回的模型结构体(比如叫PhotoResponse),把current_page的类型从数组改成Int。举个修正后的模型例子:

    struct PhotoResponse: Codable {
        let current_page: Int  // 把这里的数组类型换成Int
        let photos: [Photo]    // 这个才是要展示的图片数组
        // 其他字段比如total_pages、per_page等,照着API返回的类型补全
    }
    
    struct Photo: Codable {
        let id: Int
        let name: String
        let image_url: String
        // 图片的其他字段根据API返回定义
    }
    
  2. 调整ViewModel的解码逻辑
    之前你可能直接尝试解码[Photo]数组,但500px的API返回是包含current_page、photos等字段的外层对象,所以得先解码外层的PhotoResponse,再取出里面的photos数组。示例ViewModel代码:

    class PhotoViewModel: ObservableObject {
        @Published var photos: [Photo] = []
    
        func fetchPhotos() {
            guard let url = URL(string: "你的500px API请求地址") else { return }
    
            URLSession.shared.dataTask(with: url) { data, response, error in
                guard let data = data, error == nil else { return }
    
                do {
                    let apiResponse = try JSONDecoder().decode(PhotoResponse.self, from: data)
                    DispatchQueue.main.async {
                        self.photos = apiResponse.photos
                    }
                } catch {
                    print("解码出错:\(error)")
                }
            }.resume()
        }
    }
    
  3. 在ContentView正常展示数据
    现在ViewModel的photos数组能正确获取数据了,直接用List或者LazyVGrid展示就行:

    struct ContentView: View {
        @StateObject var viewModel = PhotoViewModel()
    
        var body: some View {
            NavigationStack {
                List(viewModel.photos) { photo in
                    VStack(alignment: .leading) {
                        Text(photo.name)
                            .font(.headline)
                        AsyncImage(url: URL(string: photo.image_url)) { image in
                            image.resizable()
                                .scaledToFit()
                        } placeholder: {
                            ProgressView()
                        }
                    }
                }
                .navigationTitle("500px 图片")
                .onAppear {
                    viewModel.fetchPhotos()
                }
            }
        }
    }
    

额外提醒:

  • 一定要对照500px API的返回结构定义模型,比如用Postman先看看API返回的JSON长什么样,每个字段的类型都要对应上。
  • 如果还有其他字段报错,看错误信息里的codingPath,它会告诉你具体是哪个字段出问题,照着修正类型就行。

内容的提问来源于stack exchange,提问作者Shiberger

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 22:04:54