【问题标题】:How can I save and then load a JSON in NSUserDefaults with SwiftyJSON?如何使用 SwiftyJSON 在 NSUserDefaults 中保存然后加载 JSON?
【发布时间】:2016-06-17 05:10:56
【问题描述】:

在我的 iOS 项目中,我需要将整个 JSON 保存为用户数据,然后在下一次应用启动时重新加载它。 将其压缩成许多值然后重新创建 JSON 不是一种选择,我只需要一些可序列化的方式来保存整个原始 JSON。 我尝试通过执行json.rawString() 将其转换为String 并通过将获得的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
}

【问题讨论】:

  • 您确定要将其保存到 NSUserDefaults 吗?最好将 JSON 反序列化为数组或字典,然后将其保存到文档目录中的 plist 并在应用启动时加载。
  • 问题是数据可能会发生变化,反正就是一个很小的JSON,所以对我来说没问题。
  • saveJSON 对你有用吗?
  • 是的,它奏效了。但是 Swift 现在可能已经改变了,如果它不再起作用,我没有尝试。有什么问题吗?

标签: ios json swift nsuserdefaults swifty-json


【解决方案1】:

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

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】:

    这是一个有效的快速示例

    import SwiftyJSON
    class Users{
    
        init(){
            let yourJSON = {"name":"Deeznuts"}
            let response = JSON(yourJSON)
    
            // Store your 
            let httpMessage = response["name"].stringValue 
    
        }
    }
    

    【讨论】:

      【解决方案3】:

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

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

      非常简单,但没有很好地记录。

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

          Swift 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,请使用它。

          【讨论】:

          • 非常感谢。完美运行。
          【解决方案6】:

          我扩展了 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")
                      }
                  }
              }
          }
          

          在我的视图控制器中的使用:

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

          【讨论】:

          • 请不要使用.synchronize()。它已被弃用,无用,如果默认域很大,甚至会产生诸如滞后之类的问题。你不需要它来保存,它是自动的,由系统完成。
          【解决方案7】:

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

          【讨论】:

            【解决方案8】:

            从 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 中编码

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2019-10-22
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-11-08
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多