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
}
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é.
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.
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.
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
}
}
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.
}
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)
}