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
相关产品推荐
相关产品推荐

