Swift JSON解码类型不匹配错误修复及ContentView数据展示方案
解决SwiftUI调用500px API时的JSON解码错误
这个错误明明白白指出:解析current_page字段时,你的代码试图把一个数字解码成数组,直接导致类型不匹配。500px API返回的current_page是个整数(比如1),但你的数据模型里肯定把这个字段错误声明成了数组类型(比如[Int])。
修复步骤:
修正数据模型的字段类型
找到你定义的对应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返回定义 }调整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() } }在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
相关产品推荐
相关产品推荐

