使用SwiftyJSONAccelerator解析指定JSON的Swift技术咨询
用SwiftyJSONAccelerator生成Swift模型解析汇率JSON的实操指南
咱们先来看你提供的原始汇率JSON数据:
{"success":true,"timestamp":1523403184,"base":"EUR","date":"2018-04-11","rates":{"AED":4.540671,"AFN":86.176964,"ALL":128.832708,"AMD":595.029101,"ANG":2.200839,"AOA":267.813784,"ARS":24.89115,"AUD":1.592116,"AWG":2.200789,"AZN":2.101261,"BAM":1.958947,"BBD":2.472797}}
你用SwiftyJSONAccelerator生成的MoneyClass.swift是专门用来映射这个JSON的模型类,它帮你把JSON里的层级结构转换成了Swift的类,还实现了NSCoding协议,方便你把数据归档到本地或者在不同场景传递。我把生成的完整模型代码补全给你:
// // MoneyClass.swift // // Copyright (c) . All rights reserved. // import Foundation import SwiftyJSON public final class MoneyClass: NSCoding { // MARK: 序列化/反序列化用的字符串常量 private struct SerializationKeys { static let success = "success" static let timestamp = "timestamp" static let base = "base" static let date = "date" static let rates = "rates" } // MARK: 模型属性 public var success: Bool? public var timestamp: Int? public var base: String? public var date: String? public var rates: Rates? // MARK: SwiftyJSON初始化方法 /// 从任意类型对象初始化(比如字典) public convenience init(object: Any) { self.init(json: JSON(object)) } /// 从SwiftyJSON对象初始化 public required init(json: JSON) { success = json[SerializationKeys.success].bool timestamp = json[SerializationKeys.timestamp].int base = json[SerializationKeys.base].string date = json[SerializationKeys.date].string rates = Rates(json: json[SerializationKeys.rates]) } /// 把模型转成字典,方便序列化 public func dictionaryRepresentation() -> [String: Any] { var dictionary: [String: Any] = [:] if let value = success { dictionary[SerializationKeys.success] = value } if let value = timestamp { dictionary[SerializationKeys.timestamp] = value } if let value = base { dictionary[SerializationKeys.base] = value } if let value = date { dictionary[SerializationKeys.date] = value } if let value = rates { dictionary[SerializationKeys.rates] = value.dictionaryRepresentation() } return dictionary } // MARK: NSCoding协议实现(归档/解归档) required public init(coder aDecoder: NSCoder) { self.success = aDecoder.decodeBool(forKey: SerializationKeys.success) self.timestamp = aDecoder.decodeObject(forKey: SerializationKeys.timestamp) as? Int self.base = aDecoder.decodeObject(forKey: SerializationKeys.base) as? String self.date = aDecoder.decodeObject(forKey: SerializationKeys.date) as? String self.rates = aDecoder.decodeObject(forKey: SerializationKeys.rates) as? Rates } public func encode(with aCoder: NSCoder) { aCoder.encode(success, forKey: SerializationKeys.success) aCoder.encode(timestamp, forKey: SerializationKeys.timestamp) aCoder.encode(base, forKey: SerializationKeys.base) aCoder.encode(date, forKey: SerializationKeys.date) aCoder.encode(rates, forKey: SerializationKeys.rates) } } public final class Rates: NSCoding { // MARK: 序列化/反序列化用的字符串常量 private struct SerializationKeys { static let aed = "AED" static let afn = "AFN" static let all = "ALL" static let amd = "AMD" static let ang = "ANG" static let aoa = "AOA" static let ars = "ARS" static let aud = "AUD" static let awg = "AWG" static let azn = "AZN" static let bam = "BAM" static let bbd = "BBD" } // MARK: 汇率属性 public var aed: Double? public var afn: Double? public var all: Double? public var amd: Double? public var ang: Double? public var aoa: Double? public var ars: Double? public var aud: Double? public var awg: Double? public var azn: Double? public var bam: Double? public var bbd: Double? // MARK: SwiftyJSON初始化方法 public convenience init(object: Any) { self.init(json: JSON(object)) } public required init(json: JSON) { aed = json[SerializationKeys.aed].double afn = json[SerializationKeys.afn].double all = json[SerializationKeys.all].double amd = json[SerializationKeys.amd].double ang = json[SerializationKeys.ang].double aoa = json[SerializationKeys.aoa].double ars = json[SerializationKeys.ars].double aud = json[SerializationKeys.aud].double awg = json[SerializationKeys.awg].double azn = json[SerializationKeys.azn].double bam = json[SerializationKeys.bam].double bbd = json[SerializationKeys.bbd].double } /// 把汇率模型转成字典 public func dictionaryRepresentation() -> [String: Any] { var dictionary: [String: Any] = [:] if let value = aed { dictionary[SerializationKeys.aed] = value } if let value = afn { dictionary[SerializationKeys.afn] = value } if let value = all { dictionary[SerializationKeys.all] = value } if let value = amd { dictionary[SerializationKeys.amd] = value } if let value = ang { dictionary[SerializationKeys.ang] = value } if let value = aoa { dictionary[SerializationKeys.aoa] = value } if let value = ars { dictionary[SerializationKeys.ars] = value } if let value = aud { dictionary[SerializationKeys.aud] = value } if let value = awg { dictionary[SerializationKeys.awg] = value } if let value = azn { dictionary[SerializationKeys.azn] = value } if let value = bam { dictionary[SerializationKeys.bam] = value } if let value = bbd { dictionary[SerializationKeys.bbd] = value } return dictionary } // MARK: NSCoding协议实现 required public init(coder aDecoder: NSCoder) { self.aed = aDecoder.decodeObject(forKey: SerializationKeys.aed) as? Double self.afn = aDecoder.decodeObject(forKey: SerializationKeys.afn) as? Double self.all = aDecoder.decodeObject(forKey: SerializationKeys.all) as? Double self.amd = aDecoder.decodeObject(forKey: SerializationKeys.amd) as? Double self.ang = aDecoder.decodeObject(forKey: SerializationKeys.ang) as? Double self.aoa = aDecoder.decodeObject(forKey: SerializationKeys.aoa) as? Double self.ars = aDecoder.decodeObject(forKey: SerializationKeys.ars) as? Double self.aud = aDecoder.decodeObject(forKey: SerializationKeys.aud) as? Double self.awg = aDecoder.decodeObject(forKey: SerializationKeys.awg) as? Double self.azn = aDecoder.decodeObject(forKey: SerializationKeys.azn) as? Double self.bam = aDecoder.decodeObject(forKey: SerializationKeys.bam) as? Double self.bbd = aDecoder.decodeObject(forKey: SerializationKeys.bbd) as? Double } public func encode(with aCoder: NSCoder) { aCoder.encode(aed, forKey: SerializationKeys.aed) aCoder.encode(afn, forKey: SerializationKeys.afn) aCoder.encode(all, forKey: SerializationKeys.all) aCoder.encode(amd, forKey: SerializationKeys.amd) aCoder.encode(ang, forKey: SerializationKeys.ang) aCoder.encode(aoa, forKey: SerializationKeys.aoa) aCoder.encode(ars, forKey: SerializationKeys.ars) aCoder.encode(aud, forKey: SerializationKeys.aud) aCoder.encode(awg, forKey: SerializationKeys.awg) aCoder.encode(azn, forKey: SerializationKeys.azn) aCoder.encode(bam, forKey: SerializationKeys.bam) aCoder.encode(bbd, forKey: SerializationKeys.bbd) } }
接下来教你怎么用这个模型解析JSON数据:
- 首先确保你的项目里已经集成了SwiftyJSON(可以用CocoaPods或者Swift Package Manager添加)
- 假设你已经从网络或者本地拿到了JSON的
Data对象,用下面的代码就能解析成模型:
// 示例:假设data是你获取到的JSON数据 do { let json = try JSON(data: data) let moneyData = MoneyClass(json: json) // 现在可以直接访问模型里的属性了 print("基础货币: \(moneyData.base ?? "未知")") print("数据日期: \(moneyData.date ?? "未知")") if let rates = moneyData.rates { print("澳元(AUD)汇率: \(rates.aud ?? 0.0)") print("阿联酋迪拉姆(AED)汇率: \(rates.aed ?? 0.0)") } } catch { print("JSON解析失败: \(error.localizedDescription)") }
最后给你几个小提示:
- 模型里的属性都是可选类型,这是为了防止JSON里某个字段缺失导致解析崩溃,使用的时候记得做可选绑定或者提供默认值
NSCoding的实现让你可以把模型对象归档到本地,比如用NSKeyedArchiver存到UserDefaults或者文件里- 如果后续汇率JSON新增了货币代码,你可以重新用SwiftyJSONAccelerator生成模型,或者手动给
Rates类添加对应的属性和解析逻辑
内容的提问来源于stack exchange,提问作者Seref Ercelik
相关产品推荐
相关产品推荐

