如何使用SwiftyJSON在NSUserDefaults中保存然后加载JSON?

时间:2016-03-03 17:59:17

标签: ios json swift nsuserdefaults swifty-json

在我的iOS项目中,我需要将整个JSON保存为用户数据,然后在下次应用启动时重新加载。 将它分解为多个值,然后重新创建JSON不是一个选项,我只需要一些可序列化的方法来保存整个原始JSON。 我尝试通过String将其转换为json.rawString()并通过将获得的string传递给JSON(string)来重新创建它,但它不起作用。

我对制作如此简单的事情的困难感到惊讶,并且因为缺乏关于这样的事情的信息而感到惊讶,所以我迫不及待地想要发现如何做到这一点:)

示例:

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
}

8 个答案:

答案 0 :(得分:23)

感谢您的回答,但他们并没有解决我的问题。我终于找到了解决方案,事实上非常简单:

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

非常简单但没有记录良好。

答案 1 :(得分:6)

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

如果您使用SwiftyJSON,请使用此选项。

答案 2 :(得分:2)

我使用了以下代码,它就像一个魅力!

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

首先尝试查看是否可以先将硬编码字符串保存到NSUserDefaults

如果要保存数据,还可以尝试拨打[defaults synchronize];电话。虽然这是 NOT ,但在极端条件下可能需要它,例如应用程序即将终止。

答案 3 :(得分:1)

这是一个有效的快速示例

    <form sf-schema="schema" sf-form="form" sf-model="row"></form>

答案 4 :(得分:1)

从UserDefaults中检索

func get(_ key: String)-> JSON? {
    
    if let standard = UserDefaults.standard.data(forKey: key), let data = try? standard.toData() {
        return JSON(data)
    } else {
        return nil
    }
}

您应该将所有内容解析为数据,以便将模型(从JSON / JSONSerialization更好)保存为UserDefaults

在Swift 5.x中编码

答案 5 :(得分:0)

我扩展了Userdefaults并添加了一个新的var,以方便我的密钥使用和一致性。 这是我的代码:

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

我的View Controller中的用法:

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

答案 6 :(得分:0)

快速4 +

比上面Alfi提供的版本更清洁的版本,适用于可能需要此版本的其他版本。

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

答案 7 :(得分:-1)

使用SwiftyJSON - SWIFT 5

scp