сохранение массива swifty json по умолчанию для пользователя

у меня есть 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 }
    ]
  }
]

Я использую свифтиджсон. Я хочу сохранить весь массив с помощью nsuserdefaults.

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

Однако я получаю сообщение об ошибке

«[Пользовательские настройки] Попытка установить объект, не входящий в список свойств».

Пожалуйста, помогите, я новичок в Swift. Я также проверил другие подобные вопросы, но, похоже, не работает.


person Dyana    schedule 02.08.2017    source источник
comment
попробуйте setObject(json.object, forKey: questionArray)   -  person koropok    schedule 02.08.2017
comment
В UserDefaults можно сохранять только объекты property list типов. Чтобы сохранить пользовательский класс/объект, вам необходимо преобразовать его в NSData, заархивировав. См. этот ответ   -  person Dávid Pásztor    schedule 02.08.2017


Ответы (4)


Вы не можете сохранить пользовательский тип SwiftyJSON JSON в UserDefaults, но вы можете сохранить массив raw, поскольку десериализованный тип коллекции JSON совместим со списком свойств.

Просто вызовите arrayObject для объекта JSON:

GlobalVar.defaults.set(json.arrayObject, forKey: "questionArray")
person vadian    schedule 02.08.2017
comment
Спасибо тебе за это. но я пробовал с json.arrayObject. И это сработало. - person Dyana; 02.08.2017
comment
я пробовал с json.arrayValue, и это дало мне указанную выше ошибку. - person Dyana; 02.08.2017
comment
Вы правы, мой плохой, я перепутал типы и отредактировал ответ. - person vadian; 02.08.2017
comment
все в порядке :) после добавления объекта json в nsuserdefault я попытался получить его, используя: let questionObject = GlobalVar.defaults.array(forKey: questionArray) Я вернул исходный массив json. Затем я сделал: для questionDict в questionObject! { lblQuestion.text = questionDict[QuestionTitle] } Однако это дает мне сообщение об ошибке: Тип «Любой» не имеет членов нижнего индекса - person Dyana; 02.08.2017
comment
Вы должны понизить типы GlobalVar.defaults.array(forKey: "questionArray") as! [[String:Any]] и lblQuestion.text = questionDict["QuestionTitle"] as! String. И имейте в виду, что приложение рухнет, если вы извлечете массив перед его однократным сохранением. - person vadian; 02.08.2017

Свифт 3.0

Вы можете сохранить данные пользовательского типа SwiftyJSON, как показано ниже.

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

И, чтобы получить данные JSON из UserDefaults, вы можете сделать это следующим образом.

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

let json = JSON(data) 
person Jaydeep Vora    schedule 02.08.2017
comment
Почему вы используете KVC для установки и получения значения? Есть особая причина? - person vadian; 02.08.2017

Вы не можете сохранить массив словаря непосредственно в NSUserDefault, вам нужно преобразовать объект массива в NSData

Дополнительные сведения:

Попытка установить объект, не являющийся списком свойств как NSUserDefaults

person Salman Ghumsani    schedule 02.08.2017

Swift 4.0 | Xcode 9.1 | SwiftyJSON

Мы можем сохранить массив словаря напрямую, без проблем. Только проблема в том, как его восстановить?

Он почти не приводится к массиву словаря (скажем, [[String : Any]]). для этого нам потребовались модули SwiftyJSON 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"))

Теперь saveFormDetailsData — это массив словаря назад [PropertyList Type], для дальнейшего мы делаем:

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