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

从NSDictionary获取JSON数据:无法提取API的Time与Price字段求助

Swift JSON解析:提取Time和Price字段解决方案

看起来你在Swift里解析API返回的JSON时,卡在了提取Time和Price字段这一步,我来帮你梳理清楚怎么解决这个问题!

首先,Swift里解析JSON最省心的方式是用Codable协议,我们只需要先定义和API返回结构完全对应的模型结构体,然后用JSONDecoder来解析数据就行。

第一步:定义对应JSON结构的Codable模型

根据你给出的API返回数据,我们需要两个结构体:一个对应整个响应,另一个对应Prices数组里的每一项:

// 对应Prices数组中的单个价格项
struct PriceItem: Codable {
    let Time: Int
    let Price: Int
}

// 对应整个API返回的响应体
struct PriceResponse: Codable {
    let Hall: String
    let Date: Int
    let Prices: [PriceItem]
}

注意:模型的属性名要和JSON里的字段完全匹配(包括大小写),比如JSON里是Time,模型里不能写成time,否则解析会失败。如果想遵循Swift的小驼峰命名规范,可以用CodingKeys做字段映射,我后面会补充这个写法。

第二步:补全URLSession请求的解析逻辑

你已经写了请求的开头,现在需要在dataTask的回调里完成数据解析,提取出Time和Price:

let url = URL(string: "http://<...>/api/prices?hall=<...>&date=20180501")
var request = URLRequest(url: url!)
request.httpMethod = "GET"

let task = URLSession.shared.dataTask(with: request) { data, response, error in
    // 先处理请求错误
    if let error = error {
        print("请求出错啦: \(error.localizedDescription)")
        return
    }
    
    // 确保拿到了有效数据
    guard let responseData = data else {
        print("没有获取到任何数据")
        return
    }
    
    do {
        // 把JSON数据解析成我们定义的模型
        let priceResponse = try JSONDecoder().decode(PriceResponse.self, from: responseData)
        
        // 现在可以遍历Prices数组,轻松提取Time和Price了!
        for priceItem in priceResponse.Prices {
            print("场次编号: \(priceItem.Time),价格: \(priceItem.Price)")
            // 这里可以把数据存到变量里,或者更新UI(注意要切回主线程)
            DispatchQueue.main.async {
                // 比如更新表格视图、标签等UI元素
            }
        }
    } catch {
        print("解析失败: \(error.localizedDescription)")
        // 打印详细错误信息,方便排查问题(比如字段不匹配、类型错误)
        print("详细错误原因: \(error)")
    }
}

task.resume()

可选优化:用CodingKeys遵循Swift命名规范

如果觉得模型里的大写属性名不符合Swift的小驼峰习惯,可以用CodingKeys来映射JSON字段和Swift属性:

struct PriceItem: Codable {
    let time: Int
    let price: Int
    
    // 映射JSON字段到Swift属性
    enum CodingKeys: String, CodingKey {
        case time = "Time"
        case price = "Price"
    }
}

struct PriceResponse: Codable {
    let hall: String
    let date: Int
    let prices: [PriceItem]
    
    enum CodingKeys: String, CodingKey {
        case hall = "Hall"
        case date = "Date"
        case prices = "Prices"
    }
}

这样修改后,解析的时候就可以用priceItem.time和priceItem.price来访问字段了,更符合Swift的编码习惯。

常见排查点

如果还是解析失败,你可以检查这几点:

  • 确认API返回的JSON格式和你提供的完全一致,有没有额外的嵌套或者字段拼写错误
  • 检查模型的属性类型是否和JSON里的类型匹配(比如JSON里的Price是数字,你不能用String类型)
  • 打印解析时的详细错误信息,错误提示会告诉你具体是哪个字段出了问题

内容的提问来源于stack exchange,提问作者Дмитрий Деникаев

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:35:01