ios - example - userdefaults save object swift
¿Cómo puedo guardar y luego cargar un JSON en NSUserDefaults con SwiftyJSON? (7)
en mi proyecto de iOS necesito guardar un JSON completo como datos de usuario y luego volver a cargarlo en el próximo lanzamiento de la aplicación. Aplastarlo en muchos valores y luego recrear el JSON no es una opción, solo necesito una forma serializable de guardar el JSON en bruto completo. Intenté convertirlo en String
haciendo json.rawString()
y recrearlo pasando la string
obtenida a JSON(string)
, pero no funciona.
Estoy asombrado por la dificultad de hacer algo tan simple y por la falta de información sobre algo como esto en línea, así que no puedo esperar para descubrir cómo hacerlo :)
Ejemplo:
public func saveJSON(j: JSON) {
let defaults = NSUserDefaults.standardUserDefaults()
defaults.setValue(j.rawString()!, forKey: "json")
// here I save my JSON as a string
}
public func loadJSON() -> JSON {
let defaults = NSUserDefaults.standardUserDefaults()
return JSON(defaults.valueForKey("json") as! String))
// here the returned value doesn''t contain a valid JSON
}
Aquí hay un ejemplo rápido que funciona
import SwiftyJSON
class Users{
init(){
let yourJSON = {"name":"Deeznuts"}
let response = JSON(yourJSON)
// Store your
let httpMessage = response["name"].stringValue
}
}
Extendí los valores predeterminados del usuario y agregué una nueva var para facilitar el uso y la consistencia de mis claves. Aquí está mi código:
extension UserDefaults {
var downloadedMarkersInfo : JSON? {
get {
if let jsonString = defaults.value(forKey: "markers") as? String {
if let json = jsonString.data(using: String.Encoding.utf8, allowLossyConversion: false) {
return try! JSON(data: json)
}
}
return nil
}
set {
if let json = newValue {
let jsonString = json.rawString()!
defaults.setValue(jsonString, forKey: "markers")
}
}
}
}
El uso en mi View Controller:
if let jsonData = defaults.downloadedMarkersInfo {
// Your code here.
}
Gracias por sus respuestas pero no resolvieron mi problema. Finalmente encontré la solución, que era muy simple en los hechos:
public func loadJSON() -> JSON {
let defaults = NSUserDefaults.standardUserDefaults()
return JSON.parse(defaults.valueForKey("json") as! String))
// JSON from string must be initialized using .parse()
}
Realmente simple pero no bien documentado.
Utilicé el siguiente código y funciona como un encanto!
NSString *json = @"{/"person/":{/"first_name/":/"Jim/", /"last_name/":/"Bell/"}} ";
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
if([defaults objectForKey:@"json"]== nil){
[defaults setObject:json forKey:@"json"];
//[defaults synchronize];
}
else{
NSLog(@"JSON %@", [defaults objectForKey:@"json"]);
}
Primero intente ver si puede guardar primero una cadena codificada en el NSUserDefaults
.
También intente llamar a [defaults synchronize];
Llama cuando quieras guardar los datos. Aunque NO es necesario, puede ser necesario en condiciones extremas, como si la aplicación está a punto de finalizar.
utilizando SwiftyJSON - SWIFT 5
var data = JSON()
if(CustomDefaults().checkObject(key: "list2")){
data = JSON.init(parseJSON: CustomDefaults().getObject(key: "list2") as? String ?? "")
}
else{
var bomb = [JSON]()
bomb.append(["name":"Happy","url":"google.com"])
let finalData = JSON(bomb).rawString() ?? "" //data.rawString() ?? ""
CustomDefaults().setObject(value: finalData, key: "list2")
}
Swift 4+
Una versión más limpia de la proporcionada por Alfi arriba, para cualquier otra cosa que pueda necesitar esto.
func addUserJSONDataToUserDefaults(userData: JSON) {
guard let jsonString = userData.rawString() else { return }
userDefaults.set(jsonString, forKey: "user")
}
func getCachedUserJSONData() -> JSON? {
let jsonString = userDefaults.string(forKey: "user") ?? ""
guard let jsonData = jsonString.data(using: .utf8, allowLossyConversion: false) else { return nil }
return try? JSON(data: jsonData)
}
Swift 4+
func saveJSON(json: JSON, key:String){
let jsonString = json.rawString()!
defaults.setValue(jsonString, forKey: key)
defaults.synchronize()
}
func getJSON(_ key: String)->JSON {
var p = ""
if let buildNumber = defaults.value(forKey: key) as? String {
p = buildNumber
}else {
p = ""
}
if p != "" {
if let json = p.data(using: String.Encoding.utf8, allowLossyConversion: false) {
return try! JSON(data: json)
} else {
return JSON("nil")
}
} else {
return JSON("nil")
}
}
Use esto si está utilizando SwiftyJSON.