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

问题描述 投票:17回答:7

在我的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
}
ios json swift nsuserdefaults swifty-json
7个回答
24
投票

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

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

真的很简单但没有记录好。


7
投票

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
投票

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

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];调用。虽然这不是必需的,但在极端条件下可能需要它,例如应用程序即将终止。


1
投票

这是一个有效的快速例子

import SwiftyJSON
class Users{

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

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

    }
}

0
投票

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

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

-1
投票

使用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")
    }
© www.soinside.com 2019 - 2024. All rights reserved.