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

Swift如何实现不同结构请求响应的自动JSON解析

实现思路
  • 首先建立接口与返回类型的绑定关系,推荐用枚举统一管理所有接口,每个接口关联对应的请求路径、返回结构体类型,避免零散的字符串判断逻辑。
  • 封装通用泛型解析方法,调用时仅需指定对应接口,方法内部自动匹配解析类型,无需手动修改解析代码。
  • 可将所有返回结构体共有的status、error_message字段抽为通用协议,进一步复用校验逻辑。
示例代码

首先定义接口管理枚举,统一绑定路径与返回类型:

enum ApiConfig {
    case getDay
    case getTime
    case getCurrentTime
    
    // 对应接口路径
    var path: String {
        switch self {
        case .getDay: return "time/get_day.php"
        case .getTime: return "time/get_time.php"
        case .getCurrentTime: return "user/get_current_time.php"
        }
    }
    
    // 对应返回结构体类型
    var responseType: Codable.Type {
        switch self {
        case .getDay: return Day.self
        case .getTime: return Time.self
        case .getCurrentTime: return CurrentTime.self
        }
    }
}

通用解析方法实现:

func parseJson<T: Codable>(api: ApiConfig, jsonData: Data) throws -> T {
    let decoder = JSONDecoder()
    // 若接口返回字段为下划线命名,可打开下面的配置自动转驼峰
    // decoder.keyDecodingStrategy = .convertFromSnakeCase
    guard let targetType = api.responseType as? T.Type else {
        throw NSError(domain: "ParseError", code: -1, userInfo: [NSLocalizedDescriptionKey: "接口返回类型不匹配"])
    }
    return try decoder.decode(targetType, from: jsonData)
}

使用示例:

// 请求对应接口拿到json数据后,仅需指定返回值类型即可完成自动解析
do {
    let dayData: Day = try parseJson(api: .getDay, jsonData: 接口返回的Data数据)
    // 直接使用解析完成的dayData对象
} catch {
    print("解析错误: \(error.localizedDescription)")
}
注意事项
  • 你的代码中Time结构体的内嵌Result类型和全局的Result结构体重名,实际运行时会有类型冲突问题,建议修改其中一个的命名避免报错。
  • 可以进一步把网络请求和解析逻辑封装在一起,调用时仅需传入接口枚举和回调,完全不需要手动处理解析逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 15:48:01