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

SwiftUI解析本地JSON遇格式错误,请求排查数据解析问题

SwiftUI本地JSON解析错误修复方案

核心问题分析

你遇到的解析错误源于三个关键不匹配:

  • JSON根结构与解析目标类型不匹配
  • JSON下划线命名的字段与结构体驼峰命名不匹配
  • 代码中文件名与实际本地文件可能存在不一致

具体修复步骤

1. 修正解析类型匹配

你的JSON根结构是包含genres和movies的对象,而非直接的电影数组,但当前代码直接尝试解析成电影数组,导致格式不兼容。需要先解析为MovieData,再提取其中的电影列表。

修改ModelData代码:

final class ModelData: ObservableObject {
    @Published var films: [Movie] = {
        let movieData: MovieData = load("moviez.json")
        return movieData.movies
    }()
}

2. 解决字段命名不匹配

JSON中的海报字段为poster_url,但结构体使用posterUrl,默认解码器无法自动映射,可选两种修复方式:

方式一:手动添加CodingKeys映射

struct Movie: Codable, Identifiable {
    let id: Int
    let title: String
    let year: String
    let runtime: String
    let director: String
    let actors: String
    let plot: String
    let posterUrl: String
    
    enum CodingKeys: String, CodingKey {
        case id, title, year, runtime, director, actors, plot
        case posterUrl = "poster_url"
    }
}

方式二:设置解码器自动转换命名风格

修改load函数中的解码器配置:

do {
    let decoder = JSONDecoder()
    decoder.keyDecodingStrategy = .convertFromSnakeCase // 自动将下划线转为驼峰
    return try decoder.decode(V.self, from: data)
} catch {
    fatalError("Couldn't parse \(filename) as \(V.self):\n\(error)")
}

3. 规范Swift命名风格

遵循Swift最佳实践,将结构体名称movies改为大写开头的Movie,变量名Film改为小写开头的films:

struct MovieData: Codable {
    let genres: [String]
    let movies: [Movie]
}

struct Movie: Codable, Identifiable {
    let id: Int
    let title: String
    let year: String
    let runtime: String
    let director: String
    let actors: String
    let plot: String
    let posterUrl: String
}

4. 确认本地文件有效性

  • 确保本地JSON文件确实命名为moviez.json,且已添加到项目主Bundle(添加时勾选"Copy items if needed"和对应Target)
  • 验证JSON文件内容无语法错误,与你提供的远程JSON结构一致

修正后的视图代码

struct MovieDetail: View {
    var movie: Movie
    var body: some View {
        Text(movie.director)
    }
}

struct MovieDetail_Previews: PreviewProvider {
    static var previews: some View {
        MovieDetail(movie: ModelData().films[0])
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 21:40:25