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

Swift技术问题:如何将JSON数据解析为字典?

解析JSON为Swift字典的完整方案

嘿,我来帮你搞定这个JSON解析的问题!先看你的代码片段,已经用到了URLSession发起请求,接下来只需要补全JSON解析的部分就行,不过先注意一个小细节:你贴的控制台输出是类JSON格式(键没有双引号,用分号分隔),标准JSON要求键必须用双引号,分隔符用逗号。如果这是服务端返回的原始数据,优先建议让后端修正为标准JSON;如果只是控制台打印的格式问题,那按标准流程解析就行。

一、标准JSON的解析步骤(推荐)

假设服务端返回的是标准JSON(比如{"cash_machine": "0.08924368023872375488", ...}),补全你的代码如下:

// 假设r是你已经构建好的URLRequest
let session = URLSession.shared.dataTask(with: r) { (data, response, error) in
    // 1. 先处理请求错误
    if let error = error {
        print("请求出错啦: \(error.localizedDescription)")
        return
    }
    
    // 2. 校验响应合法性和数据是否存在
    guard let httpResponse = response as? HTTPURLResponse,
          (200...299).contains(httpResponse.statusCode), // 确保是成功的响应码
          let data = data else {
        print("响应无效或者没有返回数据")
        return
    }
    
    // 3. 解析JSON为字典
    do {
        // 因为返回的所有值都是字符串类型的数字,所以用 [String: String] 类型
        if let jsonDictionary = try JSONSerialization.jsonObject(with: data, options: []) as? [String: String] {
            print("解析完成的字典: \(jsonDictionary)")
            
            // 示例:取出某个键的值,还可以转成Double类型
            if let cashMachineValue = jsonDictionary["cash_machine"] {
                print("cash_machine的值: \(cashMachineValue)")
                if let cashMachineDouble = Double(cashMachineValue) {
                    print("转成Double后: \(cashMachineDouble)")
                }
            }
        } else {
            print("JSON的结构不是我们预期的[String: String]字典")
        }
    } catch {
        print("JSON解析失败: \(error.localizedDescription)")
    }
}
// 别忘了启动任务!
session.resume()

二、如果遇到非标准JSON(比如你控制台输出的格式)

如果服务端真的返回这种非标准格式,那得先把字符串转换成标准JSON格式再解析,示例代码如下:

let session = URLSession.shared.dataTask(with: r) { (data, response, error) in
    // 前面的错误处理和校验和上面一样
    if let error = error {
        print("请求出错啦: \(error.localizedDescription)")
        return
    }
    
    guard let httpResponse = response as? HTTPURLResponse,
          (200...299).contains(httpResponse.statusCode),
          let data = data else {
        print("响应无效或者没有返回数据")
        return
    }
    
    // 把非标准JSON字符串转换成标准格式
    if let rawJsonString = String(data: data, encoding: .utf8) {
        // 替换格式:给键加双引号,把分号换成逗号
        let standardJsonString = rawJsonString
            .replacingOccurrences(of: "(\\w+) =", with: "\"$1\":", options: .regularExpression)
            .replacingOccurrences(of: "; ", with: ", ")
            .replacingOccurrences(of: ";", with: "") // 去掉最后一个分号
        
        // 把处理后的字符串转回Data
        guard let standardData = standardJsonString.data(using: .utf8) else {
            print("字符串转Data失败")
            return
        }
        
        // 再用标准Data解析字典
        do {
            if let jsonDict = try JSONSerialization.jsonObject(with: standardData) as? [String: String] {
                print("处理后的字典: \(jsonDict)")
            }
        } catch {
            print("处理后解析失败: \(error.localizedDescription)")
        }
    }
}
session.resume()

关键注意点

  • 类型安全:一定要用as?进行可选类型转换,避免类型不匹配导致崩溃
  • 错误处理:不要忽略error和无效响应,否则遇到异常情况会很难排查
  • 优先标准JSON:非标准格式的处理只是权宜之计,最好让后端返回符合规范的JSON,这样更稳定

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:44:50