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

Swift中如何单独解析JSON数据字符串?新手技术求助

如何在Swift 3中解析JSON并提取Symbol、Date等字段?

嘿,我完全理解作为JSON新手遇到解析报错有多闹心,尤其是照着教程试了却还是不行的时候。咱们一步步来解决这个问题,教你在Swift 3里正确解析JSON并提取你需要的Symbol、Date等字段。

第一步:定义匹配JSON结构的数据模型(推荐用Codable)

Swift 3.1及以上支持Codable协议,这是最简洁安全的解析方式。首先你需要根据目标JSON的结构,定义一个对应的模型结构体,把你要提取的字段都列出来。

假设你的目标JSON结构是这样的:

{
  "Symbol": "AAPL",
  "Date": "2024-05-20",
  "Price": 180.50
}

对应的Swift模型代码如下:

import Foundation

struct StockInfo: Codable {
    let symbol: String
    let date: String
    // 如果还有其他需要的字段,可以继续添加
    
    // 处理JSON键名和Swift命名规范不一致的情况(比如JSON是大写开头,Swift用小写驼峰)
    enum CodingKeys: String, CodingKey {
        case symbol = "Symbol"
        case date = "Date"
    }
}

这里的CodingKeys是关键——它帮你把JSON里的键名(比如Symbol)和Swift模型里的属性名(比如symbol)做映射,避免因为命名规则不同导致解析失败。

第二步:编写解析逻辑

有了模型之后,就可以用JSONDecoder来解析JSON数据了。不管你的JSON是来自网络请求、本地文件还是其他地方,只要能转成Data类型,就能用下面的代码解析:

func parseStockJSON(from data: Data) {
    do {
        // 用JSONDecoder解析成我们定义的模型对象
        let stockInfo = try JSONDecoder().decode(StockInfo.self, from: data)
        
        // 现在可以直接获取需要的字段啦
        print("提取的Symbol:\(stockInfo.symbol)")
        print("提取的Date:\(stockInfo.date)")
    } catch {
        // 解析出错时,打印详细错误信息方便排查
        print("解析失败:\(error.localizedDescription)")
        // 更详细的解码错误可以这样打印
        if let decodingError = error as? DecodingError {
            print("解码错误详情:\(decodingError)")
        }
    }
}

常见报错的排查与解决

你之前尝试方案出错,大概率是下面几个原因之一:

  • 键名不匹配:JSON里的键是Symbol,但模型里没写CodingKeys映射,直接用了symbol属性,这时候会报“key not found”错误。解决办法就是确保CodingKeys里的每个case都和JSON键名完全对应。
  • 类型不匹配:比如JSON里的Date是字符串,但你把模型里的date定义成了Date类型,这时候会报类型转换错误。如果需要把字符串转成Date,可以给JSONDecoder设置日期解码策略:
    let decoder = JSONDecoder()
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-dd" // 要和JSON里的日期格式一致
    decoder.dateDecodingStrategy = .formatted(dateFormatter)
    let stockInfo = try decoder.decode(StockInfo.self, from: data)
    
  • 字段缺失:如果JSON里某个字段可能不存在,但模型里定义成了非可选类型(比如let symbol: String),会报缺失键的错误。解决办法是把可能缺失的字段定义成可选类型:let symbol: String?。

如果你习惯用旧的JSONSerialization方法

如果你之前参考的方案用的是JSONSerialization,也可以这样解析(但不如Codable安全,需要手动做类型转换):

func parseWithJSONSerialization(from data: Data) {
    do {
        guard let jsonDict = try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any] else {
            print("JSON不是预期的字典格式")
            return
        }
        
        // 手动提取字段,注意类型转换
        if let symbol = jsonDict["Symbol"] as? String {
            print("Symbol:\(symbol)")
        }
        if let date = jsonDict["Date"] as? String {
            print("Date:\(date)")
        }
    } catch {
        print("解析错误:\(error)")
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:28:52