Ios 如何在Swift中将JSON数据保存到UserDefault?

Ios 如何在Swift中将JSON数据保存到UserDefault?,ios,swift,Ios,Swift,我用Alamofire发出了一个post请求。这是我使用端点从服务器获取数据的代码: Alamofire.request("http://192.168.80.21:3204/api/auth/signin", method: .post, parameters: parameters,encoding: JSONEncoding.default, headers: nil).responseJSON { response in swi

我用Alamofire发出了一个post请求。这是我使用端点从服务器获取数据的代码:

    Alamofire.request("http://192.168.80.21:3204/api/auth/signin", method: .post, parameters: parameters,encoding: JSONEncoding.default, headers: nil).responseJSON {
        response in
        switch response.result {
        case .success(let value):
            let json = JSON(value)
            print(json)

            break
        case .failure(let error):
            print("Error :- \(error)")
        }
    }
}  
这是我从服务器上得到的数据:

{
  "accessToken" : "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6NTIsInJvbGUiOjEsImlhdCI6MTYwMzg2ODUxNCwiZXhwIjoxNjAzOTU0OTE0fQ.y68w8XQfqFZDVgaxiuFuVCOqaI5e5vZ-SfoDB_Ctxro",
  "role" : "admin",
   "auth" : true
}

我想将响应保存到UserDefault以供进一步使用。帮助我将数据保存到Userdefault,并检索和打印数据。

如果使用全局变量。您可以根据您的目的使用
save
方法,如下所示:

let objects = [yourObjectClass]()

        func save() {
            let jsonEncoder = JSONEncoder()
            if let savedData = try? jsonEncoder.encode(objects) { 
                let defaults = UserDefaults.standard    
                defaults.set(savedData, forKey: "objects") 
            } else {
                print("Failed to save objects.")
            }
        }
    }
accessToken

func setInDefault<T: Codable>(key: String, type: T.Type, data: T?) {
    
    guard let data = data else {
        return
    }

    do {
        let encoder = JSONEncoder()
        let encodeData = try encoder.encode(data)
        let dict:[String:Any] = try JSONSerialization.jsonObject(with: encodeData, options: .allowFragments) as! [String : Any]
        
        let data = NSKeyedArchiver.archivedData(withRootObject: dict)

        //set user data in defaults
        UserDefaults.standard.set(data, forKey: key)
        UserDefaults.standard.synchronize()
    } catch {
        print(error)
        //handle error
    }
}

func getFromDefault<T: Codable>(key: String, type: T.Type) -> T? {

    let archieved = UserDefaults.standard.value(forKey: key)
    let dict = NSKeyedUnarchiver.unarchiveObject(with: archieved as? Data ?? Data())
    let decoder = JSONDecoder()
    do {
        if let dic = dict {
            let data = try JSONSerialization.data(withJSONObject: dic, options: .prettyPrinted)
            return try decoder.decode(type, from: data)
        }
        
    } catch {
        print(error)
         //handle error
    }
    return nil
}
这里,

参数:
data
是类型为
T
的通用参数。所以这里您需要传递从服务器获得的响应数据。(应该是
Codable
类类型)

参数:
AuthUser
is

struct AuthUser : Codable {

  let accessToken : String?
  let role: String?
  let auth: Bool?

  enum CodingKeys: String, CodingKey {
    case accessToken = "accessToken"
    case role = "role"
    case auth = "auth"
  }

  init(from decoder: Decoder) throws {
    let values = try decoder.container(keyedBy: CodingKeys.self)
    accessToken = try values.decodeIfPresent(String.self, forKey: .accessToken)
    role = try values.decodeIfPresent(String.self, forKey: .role)
    auth = try values.decodeIfPresent(Bool.self, forKey: .auth)
  }
}
要获取数据,请执行以下操作:

 let data = getFromDefault(key: "userData", type: AuthUser.self)
 print(data)

您可以使用下面的函数代码将JSON模型数据保存在Userdefaults中

 func saveData(data: yourModelData){
        var userDefaults = UserDefaults.standard
        let encodedData: Data = NSKeyedArchiver.archivedData(withRootObject: yourModelData)
        userDefaults.set(encodedData, forKey: "yourKey")
        userDefaults.synchronize()
        
    }
 
和从Userdefaults检索数据使用此功能

func getData() -> yourModelData {
        var userDefaults = UserDefaults.standard
        let decoded  = userDefaults.data(forKey: "yourKey")
        let decodedData = NSKeyedUnarchiver.unarchiveObject(with: decoded) as! [yourModelData]
        return decodedData
    }

创建符合
Codable

struct Auth: Codable {
    let accessToken, role: String
    let auth: Bool
}
并扩展
UserDefaults

extension UserDefaults {
    func auth(forKey defaultName: String) -> Auth? {
        guard let data = data(forKey: defaultName) else { return nil }
        do {
            return try JSONDecoder().decode(Auth.self, from: data)
        } catch { print(error); return nil }
    }

    func set(_ value: Auth, forKey defaultName: String) {
        let data = try? JSONEncoder().encode(value)
        set(data, forKey: defaultName)
    }
}
现在,您可以使用
auth(forKey:)
set(uquo:forKey:)
直接读取和写入
auth
实例

删除SwiftyJSON并更改Alamofire部分,以使用
JSONDecoder

Alamofire.request("http://192.168.80.21:3204/api/auth/signin", method: .post, parameters: parameters).responseData {
    response in
    switch response.result {
    case .success(let data):
        do { 
            let auth = try JSONDecoder().decode(Auth.self, from: data)
            print(auth)
            UserDefaults.standard.set(auth, forKey: "Auth")
        } catch { print(error) }

    case .failure(let error):
        print("Error :- \(error)")
    }
}
要读取实例,请编写

let auth = UserDefaults.standard.auth(forKey: "Auth")

参数:数据是要存储的数据。请检查编辑的答案。注意,在大多数情况下类型参数不是必需的,至少可以使用默认值
type:T.type=T.self
let auth = UserDefaults.standard.auth(forKey: "Auth")