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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 06:36:00