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

Swift 4中如何将JSON数据保存到UserDefaults?附模型类代码

保存自定义对象到UserDefaults的解决方案

首先,核心问题是自定义对象无法直接存入UserDefaults,我们需要把UserDetails序列化成UserDefaults支持的类型(比如Data)后再存储。结合你已经在用的ObjectMapper,可以这样实现:

1. 完善保存与读取方法

修改你的Default类,补充完整的保存逻辑,同时添加读取方法方便后续获取用户数据:

class Default : NSObject{
    // 定义统一的存储key,避免硬编码出错
    static let savedUserKey = "persisted_user_details"
    
    static func saveToSharedPrefs(user: UserDetails?) {
        let defaults = UserDefaults.standard
        
        guard let validUser = user else {
            // 如果传入nil,清空已存储的用户数据
            defaults.removeObject(forKey: savedUserKey)
            defaults.synchronize()
            return
        }
        
        // 用ObjectMapper将UserDetails转成字典
        if let userDict = validUser.toJSON() {
            do {
                // 把字典转成可存储的Data类型
                let userData = try JSONSerialization.data(withJSONObject: userDict, options: [])
                defaults.set(userData, forKey: savedUserKey)
                defaults.synchronize()
            } catch {
                print("保存用户数据失败:\(error.localizedDescription)")
            }
        }
    }
    
    // 读取已保存的用户数据
    static func getSavedUser() -> UserDetails? {
        let defaults = UserDefaults.standard
        
        guard let userData = defaults.data(forKey: savedUserKey) else {
            return nil
        }
        
        do {
            // 将Data转回字典,再用ObjectMapper转成UserDetails对象
            if let userDict = try JSONSerialization.jsonObject(with: userData, options: []) as? [String: Any] {
                return Mapper<UserDetails>().map(JSON: userDict)
            }
        } catch {
            print("读取用户数据失败:\(error.localizedDescription)")
        }
        return nil
    }
}

2. 登录成功后的调用逻辑

当你拿到登录返回的UserRoot对象后,直接调用保存方法即可:

// 假设登录后得到了userRoot实例
if userRoot.success {
    Default.saveToSharedPrefs(user: userRoot.user)
} else {
    // 登录失败时可选清空旧数据,避免残留无效信息
    Default.saveToSharedPrefs(user: nil)
}

3. 额外注意事项

  • 如果UserDetails里包含嵌套的自定义对象,确保这些嵌套对象也遵循了Mappable协议,否则toJSON()无法完整序列化所有属性。
  • defaults.synchronize()在iOS 10+并非强制调用,但加上可以确保数据立即写入磁盘,适合对实时性要求高的场景。
  • 若后续想切换到苹果原生序列化方案,只需让UserDetails遵循Codable协议,用JSONEncoder/JSONDecoder替代ObjectMapper即可,代码会更简洁。

内容的提问来源于stack exchange,提问作者Gorib Developer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:52:25