在我的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
}
答案 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