SwiftUI新手解析Web API返回JSON数据失败求排查原因
问题修复方案
以下是针对你代码问题的逐个修复说明:
1. 核心解码错误修复
你自定义的APIResponse解码逻辑存在类型匹配错误,是导致解析失败的直接原因:原代码尝试将pois、grid字段解码为APIResponse类型,和JSON中实际的数组类型完全不匹配。APIResponse完全不需要手动写CodingKeys和自定义解码方法,直接使用Codable自动合成能力即可,简化后代码:
struct APIResponse: Codable { let pois: [InputDataPois] let grid: [InputDataGrid] }
2. 冗余代码清理
InputDataPois的自定义CodingKeys和解码初始化方法完全冗余,所有字段的名称、类型都和JSON完全匹配,直接使用系统自动合成的Codable实现即可:
struct InputDataPois: Codable, Identifiable { let id: String let lat: String let lat_s: String let lng: String let lng_s: String let street: String let content: String let backend: String let type: String let vmax: String let counter: String let create_date: String let confirm_date: String let gps_status: String let info: String let polyline: String }
空结构体InputDataGrid无需修改,可正常支持空数组解码。
3. 网络请求逻辑修正
Bundle是用于读取App本地包内资源的工具类,不适合用来请求网络接口。你用的Data(contentsOf:)是同步读取方法,会卡住主线程,且网络波动时会直接崩溃,建议替换为URLSession异步请求逻辑,示例代码如下:
func fetchSpeedData() async throws -> [InputDataPois] { guard let url = URL(string: "https://cdn2.atudo.net/api/1.0/vl.php?type=0,1,2,3,4,5,6&box=52.36176390234046,10.588760375976562,52.466468685912744,11.159706115722656") else { throw URLError(.badURL) } let (data, _) = try await URLSession.shared.data(from: url) let result = try JSONDecoder().decode(APIResponse.self, from: data) return result.pois }
在SwiftUI视图中可以通过.task修饰符调用该异步方法获取数据。
内容的提问来源于stack exchange,提问作者Nicodimarco
相关产品推荐
相关产品推荐

