Как сохранить и загрузить JSON в NSUserDefaults с помощью SwiftyJSON?
в моем проекте 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
}
Ответы
Ответ 1
Спасибо за ваши ответы, но они не решили мою проблему. Я наконец нашел решение, которое было действительно простым в фактах:
public func loadJSON() -> JSON {
let defaults = NSUserDefaults.standardUserDefaults()
return JSON.parse(defaults.valueForKey("json") as! String))
// JSON from string must be initialized using .parse()
}
Действительно простой, но не документированный.
Ответ 2
Свифт 5+
func saveJSON(json: JSON, key:String){
if let jsonString = json.rawString() {
UserDefaults.standard.setValue(jsonString, forKey: key)
}
}
func getJSON(_ key: String)-> JSON? {
var p = ""
if let result = UserDefaults.standard.string(forKey: key) {
p = result
}
if p != "" {
if let json = p.data(using: String.Encoding.utf8, allowLossyConversion: false) {
do {
return try JSON(data: json)
} catch {
return nil
}
} else {
return nil
}
} else {
return nil
}
}
Используйте это, если вы используете SwiftyJSON.
Ответ 3
Я использовал следующий код, и он работает как шарм!
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];
, когда вы хотите сохранить данные. Хотя это НЕ, это может потребоваться в экстремальных условиях, например, если приложение вот-вот закончится.
Ответ 4
Вот пример, который работает
import SwiftyJSON
class Users{
init(){
let yourJSON = {"name":"Deeznuts"}
let response = JSON(yourJSON)
// Store your
let httpMessage = response["name"].stringValue
}
}
Ответ 5
Я расширил 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
Свифт 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
используя 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")
}