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
相关产品推荐
相关产品推荐

