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

使用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数据:

  1. 首先确保你的项目里已经集成了SwiftyJSON(可以用CocoaPods或者Swift Package Manager添加)
  2. 假设你已经从网络或者本地拿到了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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:44:02