2016-03-03 10 views
15

nel mio progetto iOS Devo salvare un intero JSON come dati utente e ricaricarlo al prossimo avvio dell'app. Schiacciarlo in molti valori e quindi ricreare il JSON non è un'opzione, ho solo bisogno di un modo serializzabile per salvare l'intero JSON grezzo. Ho provato a convertirlo in String facendo json.rawString() e ricrearlo passando il string ottenuto a JSON(string), ma non funziona.Come posso salvare e quindi caricare un JSON in NSUserDefaults con SwiftyJSON?

Sono entrambi stupito dalla difficoltà di fare una cosa così semplice e per la mancanza di informazioni su una cosa del genere online, quindi non vedo l'ora di scoprire come fare :)

Esempio:

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 
} 
+0

Sei sicuro di voler salvarlo NSUserDefaults? Potrebbe essere meglio deserializzare il JSON in un array o un dizionario e quindi salvarlo in un plist nella directory dei documenti e caricarlo all'avvio dell'app. – Abizern

+0

Il problema è che i dati potrebbero cambiare, e comunque è un JSON molto piccolo, quindi per me va bene. –

+0

saveJSON ha funzionato per te? –

risposta

19

Grazie per le vostre risposte, ma non ha risolto il mio problema. Ho finalmente trovato la soluzione, che era molto semplice nei fatti:

public func loadJSON() -> JSON { 
    let defaults = NSUserDefaults.standardUserDefaults() 
    return JSON.parse(defaults.valueForKey("json") as! String)) 
    // JSON from string must be initialized using .parse() 
} 

molto semplice, ma non documentato bene.

2

Ho utilizzato il seguente codice e funziona come un incantesimo!

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"]); 
} 

Prima prova per vedere se è possibile salvare una stringa hard-coded al NSUserDefaults prima.

Provare anche a chiamare una chiamata [defaults synchronize]; quando si desidera salvare i dati. Anche se questo è NON richiesto, potrebbe essere necessario in condizioni estreme, ad esempio se l'applicazione sta per terminare.

1

Ecco un esempio veloce che funziona

import SwiftyJSON 
class Users{ 

    init(){ 
     let yourJSON = {"name":"Deeznuts"} 
     let response = JSON(yourJSON) 

     // Store your 
     let httpMessage = response["name"].stringValue 

    } 
} 
-1

rapida 3

func setObject(value:JSON ,key:String){ 
     let pref = UserDefaults.standard 
     pref.set(value.rawString(), forKey: key) 
     pref.synchronize() 
} 

func getObject(key:String) -> JSON{ 
    let pref = UserDefaults.standard 
    let string = pref.value(forKey: key) as! String 
    let dataFromString = string.data(using: String.Encoding.utf8, allowLossyConversion: false) 
    return JSON(data: dataFromString!) 
} 
Problemi correlati