【问题标题】:saving swifty json array to user defaults将 swifty json 数组保存到用户默认值
【发布时间】:2018-01-09 11:36:15
【问题描述】:

我有一个 json data,它提供了以下信息:

let data = [
  {
    "QuestionTitle" : "Entomology is the science that studies",
    "Id" : 205,
    "Options" : [
      { "Option" : "Insects", "Id" : 810 },
      { "Option" : "The origin and history of technical and scientific terms", "Id" : 811 },
      { "Option" : "The formation of rocks", "Id" : 812 },
      { "Option" : "Behavior of human beings", "Id" : 809 }
    ]
  },
  {
    "QuestionTitle" : "A train running at the speed of 60 km\/hr crosses a pole in 9 seconds. What is the length of the train?",
    "Id" : 199,
    "Options" : [
      { "Option" : "120 metres", "Id" : 785 },
      { "Option" : "324 metres", "Id" : 787 },
      { "Option" : "180 metres", "Id" : 786 },
      { "Option" : "150 metres", "Id" : 788 }
    ]
  }
]

我正在使用 swiftyjson。我想使用 nsuserdefaults 保存整个数组。

GlobalVar.defaults.set(json, forKey: "questionArray")
GlobalVar.defaults.synchronize()

但是,我得到一个错误

“[用户默认值] 尝试设置非属性列表对象”。

请帮助我是 swift 的新手。我还检查了其他类似的问题,但似乎不起作用。

【问题讨论】:

  • 试试 setObject(json.object, forKey: "questionArray")
  • 您只能将对象保存到UserDefaults property list 类型。为了保存自定义类/对象,您需要通过归档将其转换为NSData。见this answer

标签: swift alamofire swifty-json


【解决方案1】:

Swift 4.0 | Xcode 9.1 | SwiftyJSON

我们可以直接保存字典数组,没问题。 只是,问题是,如何找回呢?

它几乎没有转换为字典数组(比如 [[String : Any]])。为此,我们需要 SwiftyJSON pod import SwiftyJSON // Don't forget this

let arrayOfDictionary = [
                         { 
                           "VersionNumber" : "1.0.0.0", 
                                  "FormID" : "18"
                          },
                         {
                           "VersionNumber" : "1.0.0.3",
                                  "FormID" : "19"
                          }
                         ]

直接将其保存到 UserDefaults 中,例如:

UserDefaults.standard.set(saveFormDetails, forKey: "FormDetails")

从 UserDefaults 中检索:

let savedFormDetailsData = JSON.init(rawValue:UserDefaults.standard.array(forKey: "FormDetails"))

现在,savedFormDetailsData 是字典返回的数组 [PropertyList 类型],我们进一步做:

for form in 0..<arrayOfDictionary.count {
    print("FormID :", savedFormDetailsData?[form]["FormID"]) 
    print("VersionNumber :", savedFormDetailsData?[form]["VersionNumber"])
}

【讨论】:

    【解决方案2】:

    您无法将 SwiftyJSON 的自定义类型 JSON 保存为 UserDefaults,但您可以保存 raw 数组,因为反序列化的 JSON 集合类型符合属性列表。

    只需在JSON 对象上调用arrayObject

    GlobalVar.defaults.set(json.arrayObject, forKey: "questionArray")
    

    【讨论】:

    • 谢谢你。但我尝试使用 json.arrayObject。它奏效了。
    • 我用 json.arrayValue 试过,它给了我上面的错误。
    • 你是对的,我的错,我混淆了类型并编辑了答案。
    • 没关系 :) 在将 json 对象添加到 nsuserdefault 后,我​​尝试使用以下方法检索它: let questionObject = GlobalVar.defaults.array(forKey: "questionArray") 我取回了我原来的 json 数组。然后,我做了:对于 questionObject 中的 questionDict! { lblQuestion.text = questionDict["QuestionTitle"] } 但是,这给了我一个错误声明:“Type 'Any' has no subscript members”
    • 您必须向下转换类型 GlobalVar.defaults.array(forKey: "questionArray") as! [[String:Any]]lblQuestion.text = questionDict["QuestionTitle"] as! String。请注意,如果您在保存数组之前检索该数组,应用程序将会崩溃。
    【解决方案3】:

    Swift 3.0

    您可以像下面这样保存 SwiftyJSON 自定义类型数据。

    guard let rawData = try? json.rawData() else { return }
    UserDefaults.standard.setValue(rawData, forKey: "Your_key")
    

    而且,要从 UserDefaults 中检索 JSON 数据,您可以这样做。

    guard let data = UserDefaults.standard.value(forKey: "Your_key") as? Data else { return }
    
    let json = JSON(data) 
    

    【讨论】:

    • 为什么要使用KVC来设置和获取值?有什么特别的原因吗?
    【解决方案4】:

    不能将字典数组直接保存到NSUserDefault需要将数组对象转换成NSData

    查看更多帮助:

    Attempt to set a non-property-list object as an NSUserDefaults

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多