SwiftUI中从本地JSON文件获取并解析数据的技术咨询
代码问题排查与修正
核心问题1:结构体字段与JSON不匹配
你定义的FunkoPop结构体中使用了imageName属性,但目标JSON文件里对应的字段是image,Codable默认要求字段名精确匹配,这会直接导致解码失败。
修正方案二选一:
- 直接修改结构体属性名,与JSON字段保持一致:
struct FunkoPop: Codable { let handle: String let image: String let title: String let series: [String] }
- 通过
CodingKeys做字段映射,保留原有属性名:
struct FunkoPop: Codable { let handle: String let imageName: String let title: String let series: [String] enum CodingKeys: String, CodingKey { case handle, title, series case imageName = "image" } }
核心问题2:本地文件加载过度设计
你用URLSession.dataTask加载Bundle内的本地JSON文件完全没必要——URLSession是为网络请求设计的,本地文件直接同步读取更高效简洁:
private func fetchData() { guard let url = Bundle.main.url(forResource: "funko_pop", withExtension: "json"), let data = try? Data(contentsOf: url) else { print("无法读取本地JSON文件") return } do { let decoder = JSONDecoder() let decodedData = try decoder.decode([FunkoPop].self, from: data) // 如果funkoPops用于UI更新,确保在主队列赋值 DispatchQueue.main.async { self.funkoPops = decodedData } } catch { print("JSON解码错误: \(error)") } }
额外排查项
- 确认
funko_pop.json已添加到项目Target中:在Xcode选中文件,查看右侧Inspector面板的「Target Membership」是否勾选,否则Bundle.main.url会返回nil。 - 检查JSON文件编码:确保文件是UTF-8格式,避免读取时出现数据损坏或乱码。
内容的提问来源于stack exchange,提问作者GiuAte
相关产品推荐
相关产品推荐

