web-dev-qa-db-ja.com

SwiftyJSONを使用してNSUserDefaultsにJSONを保存してロードする方法を教えてください。

iOSプロジェクトでは、JSON全体をユーザーデータとして保存し、次のアプリの起動時に再読み込みする必要があります。それを多くの値に押しつぶしてからJSONを再作成することはできません。生のJSON全体を保存するシリアル化可能な方法が必要です。 json.rawString()を実行してStringに変換し、取得したstringJSON(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
}
20

回答ありがとうございますが、私の問題は解決されませんでした。私はついに解決策を見つけました、それは実際には本当に簡単でした:

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

本当にシンプルですが、十分に文書化されていません。

23

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を使用する場合に使用します。

6
Alfi

私は次のコードを使用しましたが、それは魅力のように機能します!

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];データを保存するときに呼び出します。 [〜#〜](〜#〜]は必須ではありませんが、次のような極端な条件では必要になる場合がありますアプリが終了しようとしている場合。

2
Ruchira Randana

これはSwift機能する例です

import SwiftyJSON
class Users{

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

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

    }
}

私はUserdefaultsを拡張し、キーの使いやすさと一貫性のために新しい変数を追加しました。これが私のコードです:

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.
}
0
Pablo Marrufo

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
Hector E. Mejia