how example data array ios json swift nsuserdefaults swifty-json

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.