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

SwiftUI中从本地JSON文件获取并解析数据的技术咨询

代码问题排查与修正

核心问题1:结构体字段与JSON不匹配

你定义的FunkoPop结构体中使用了imageName属性,但目标JSON文件里对应的字段是image,Codable默认要求字段名精确匹配,这会直接导致解码失败。

修正方案二选一:

  1. 直接修改结构体属性名,与JSON字段保持一致:
struct FunkoPop: Codable {
    let handle: String
    let image: String
    let title: String
    let series: [String]
}
  1. 通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 04:35:55