web-dev-qa-db-fra.com

Comment enregistrer et charger un JSON dans NSUserDefaults avec SwiftyJSON?

dans mon projet iOS, je dois enregistrer un JSON entier en tant que données utilisateur, puis le recharger au lancement suivant de l'application . Le réduire en plusieurs valeurs, puis recréer le JSON, n'est pas une option. Tout le JSON brut . J'ai essayé de le convertir en String en faisant json.rawString() et de le recréer en passant le string obtenu à JSON(string), mais cela ne fonctionne pas.

Je suis aussi étonné par la difficulté de faire une chose aussi simple que par le manque d'informations sur ce genre de chose en ligne, alors j'ai hâte de découvrir comment faire cela :)

Exemple:

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
}
16
Michele Bontorno

Merci pour vos réponses mais elles n'ont pas résolu mon problème. J'ai finalement trouvé la solution, qui était très simple:

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

Vraiment simple mais pas bien documenté.

23
Michele Bontorno

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

Utilisez ceci si vous utilisez SwiftyJSON.

6
Alfi

J'ai utilisé le code suivant et cela fonctionne comme un charme!

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

Commencez par essayer de voir si vous pouvez d'abord enregistrer une chaîne codée en dur dans NSUserDefaults.

Essayez également d'appeler un appel [defaults synchronize]; lorsque vous souhaitez enregistrer les données. Bien que cela soitPAS, cela peut être nécessaire dans des conditions extrêmes, par exemple si l'application est sur le point de se terminer.

2
Ruchira Randana

Voici un exemple Swift qui fonctionne

import SwiftyJSON
class Users{

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

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

    }
}
1

J'ai étendu Userdefaults et ajouté une nouvelle variable pour faciliter l'utilisation et la cohérence de mes clés. Voici mon code:

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

L'utilisation dans mon contrôleur de vue:

if let jsonData = defaults.downloadedMarkersInfo {
// Your code here.
}
0
Pablo Marrufo

Swift 4+

Une version plus propre à celle fournie par Alfi ci-dessus, pour tous les autres qui pourraient en avoir besoin.

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)
}
0
Hector E. Mejia