2016-12-14 2 views
8

Я пытаюсь сделать преобразование из Objc в swift и иметь лучшие дни.Как сохранить/получить словарь из файла с помощью SwiftyJSON

У меня есть класс со словарем:

collaborationDictionary:[String:Set<String>] 

Я пытаюсь писать/читать этот словарь в/из файла и просто не вполне может показаться, чтобы заставить его работать. Я должен сохранить словарь, используя следующую структуру JSON, и я должен использовать SwiftyJSON.

{ "Collaborations" : { 
      "5604" : [ 
       "whiteboard.png", 
       "VID_20161123_135117.3gp", 
       "Photo_0.jpeg"] 
      "5603" : [ 
       "VID_20161123_135117.3gp"], 
      "5537" : [ 
       "Screenshot_20151212-132454.png", 
       "VID_20161202_083205.3gp", 
       "VID_20161123_135117.3gp", 
       "Photo_0.jpeg", 
       "Screenshot_20151212-132428.png", 
       "Screenshot_20151212-132520.png", 
       "IMG_20161017_5.jpg", 
       "whiteboard.png"]} 
} 

У меня нет реальной проблемы с поиском или извлечением файла или записью файла. Я просто не могу понять, как вручную загружать SwiftyJSON. Мне нужно, чтобы объект JSON назывался «Collaborations» наверху. Он должен содержать словарь идентификаторов сотрудничества (5604, 5603 ...). Каждое сотрудничество содержит массив строк (имена файлов). Я включаю код, который я использую для чтения/записи файла, но мне нужна помощь в библиотеке SwiftyJSON.

Это элемент данных член я использую для хранения данных выше:

Эти функции мне нужно закончить:

 private var collaborationDictionary:[String:Set<String>] = [:] 


    func getUploadedFileSet() { 
    collaborationDictionary = [:] 
    let documentsURL = URL(string: NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]) 
    let appURL = documentsURL?.appendingPathComponent(APP_DISTINGUISHED_NAME) 
    let jsonFileURL = appURL?.appendingPathComponent(UPLOADED_ITEMS_DB_JSON) 

    if FileManager.default.fileExists(atPath: (jsonFileURL?.absoluteString)!) { 
     do { 
      let data = try Data(contentsOf: jsonFileURL!, options: .alwaysMapped) 
      let json = JSON(data: data) 

      // ************************************************ 
      // NEED HELP START 
      // NOW WHAT???? What is the SwiftyJSON code 

      ?????????????????????????     

      // NEED HELP END 
      // ************************************************ 

     } catch let error { 
      print(error.localizedDescription) 
     } 
    } 
} 

    func saveUploadedFilesSet() {   
    let documentsURL = URL(string: NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]) 
    let appURL = documentsURL?.appendingPathComponent(APP_DISTINGUISHED_NAME) 
    let jsonFileURL = appURL?.appendingPathComponent(UPLOADED_ITEMS_DB_JSON) 

    do { 
     let dirExists = FileManager.default.fileExists(atPath: (appURL?.absoluteString)!) 
     if !dirExists { 
      try FileManager.default.createDirectory(atPath: (appURL?.absoluteString)!, withIntermediateDirectories: false, attributes: nil) 
     } 

     // ************************************************ 
     // NEED HELP START 
      // NOW WHAT???? What is the SwiftyJSON code 

      ?????????????????????????     

     // NEED HELP END 
     // ************************************************ 

     // Write to file code - haven't written it yet but that should be easy   

    } catch let error as NSError { 
     print(error.localizedDescription); 
    } 
} 

Любое направление будет высоко ценится. Благодаря!

EDIT

Я был в состоянии понять, как загрузить прилагающуюся структуру JSON из файла. Вот код:

func getUploadedFileSet() { 
    let documentsURL = URL(string: NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]) 
    let appURL = documentsURL?.appendingPathComponent(APP_DISTINGUISHED_NAME) 
    let jsonFileURL = appURL?.appendingPathComponent(UPLOADED_ITEMS_DB_JSON) 

    if FileManager.default.fileExists(atPath: (jsonFileURL?.absoluteString)!) { 
     do { 
      let data = try Data(contentsOf: jsonFileURL!, options: .alwaysMapped) 
      let json = JSON(data: data) 
      if json != nil { 
       for (key, subJson) in json[kCollaborations] { 
        let stringArray:[String] = subJson.arrayValue.map { $0.string! } 
        let stringSet = Set(stringArray) 
        collaborationDictionary.updateValue(stringSet, forKey: key) 
       } 
      } else { 
       print("Could not get json from file, make sure that file contains valid json.") 
      } 
     } catch let error { 
      print(error.localizedDescription) 
     } 
    } 

Я до сих пор не понял, как сохранить совместный документ в Word. Моя самая большая проблема заключается в том, как ввести ключ «Сотрудничество». Есть идеи?

+0

Каков ваш конкретный вопрос? – Raphael

+0

В частности, что такое код для чтения и запись объекта json. Я выделим разделы, где код должен быть проверен/исправлен или создан. – JustLearningAgain

+0

длинный рассказ короткий, вам нужно загрузить файл с диска? прочитайте его как строку? и сериализовать json с помощью SwiftyJSON? –

ответ

5

Я, наконец, получил это, чтобы работать. Самая большая проблема заключалась в том, что я не мог преобразовать совместный документ в JSON. Мне, наконец, пришлось преобразовать его в словарь массивов и словарь множеств. Вот 2 метода:

 // ************************************************************************** 
func getUploadedFileSet() { 
    let documentsURL = URL(string: NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]) 
    let appURL = documentsURL?.appendingPathComponent(APP_DISTINGUISHED_NAME) 
    let jsonFileURL = appURL?.appendingPathComponent(UPLOADED_ITEMS_DB_JSON) 

    if FileManager.default.fileExists(atPath: (jsonFileURL?.absoluteString)!) { 
     do { 
      let data = try Data(contentsOf: jsonFileURL!, options: .alwaysMapped) 
      let json = JSON(data: data) 
      if json != nil { 
       for (key, subJson) in json[kCollaborations] { 
        let stringArray:[String] = subJson.arrayValue.map { $0.string! } 
        let stringSet = Set(stringArray) 
        collaborationDictionary.updateValue(stringSet, forKey: key) 
       } 
      } else { 
       print("Could not get json from file, make sure that file contains valid json.") 
      } 
     } catch let error { 
      print(error.localizedDescription) 
     } 
    } 
} 

// ************************************************************************** 
func saveUploadedFilesSet() { 
    let documentsURL = URL(string: NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]) 
    let appURL = documentsURL?.appendingPathComponent(APP_DISTINGUISHED_NAME) 
    let jsonFileURL = appURL?.appendingPathComponent(UPLOADED_ITEMS_DB_JSON) 
    let adjustedJSONFileURL = URL(fileURLWithPath:(jsonFileURL?.absoluteString)!) 

    do { 
     let dirExists = FileManager.default.fileExists(atPath: (appURL?.absoluteString)!) 
     if !dirExists { 
      try FileManager.default.createDirectory(atPath: (appURL?.absoluteString)!, withIntermediateDirectories: false, attributes: nil) 
     } 

     // Convert set elements to arrays 
     var convertedCollaborationDictionary: [String:[String]] = [:] 
     for (sessionID, fileNameSet) in collaborationDictionary { 
      let array = Array(fileNameSet) 
      convertedCollaborationDictionary.updateValue(array, forKey: sessionID) 
     } 
     let json: JSON = JSON(convertedCollaborationDictionary) 
     let fullJSON: JSON = [kCollaborations:json.object] 
     let data = try fullJSON.rawData() 
     try data.write(to: adjustedJSONFileURL, options: .atomic) 

    } catch let error as NSError { 
     print(error.localizedDescription); 
    } 
} 
1

Если покопаться в источник, SwiftyJSON обертывания JSONSerialization, которые оба могут быть инициализирован и преобразованы обратно в данных, который умеет читать и писать себя с диска:

func readJSON() -> JSON? { 
     guard let url = Bundle.main.url(forResource: "data", withExtension: "json"), 
      let data = try? Data(contentsOf: url) else { 
      return nil 
     } 
     return JSON(data: data) 
    } 

    func write(json: JSON, to url: URL) throws { 
     let data = try json.rawData() 
     try data.write(to: url) 
    } 

Заметим, что вы можете загрузить статические данные из любого места, включая ваш Bundle, но вы можете писать только в песочницу (то есть в папку «Документы»). Вы можете скопировать из своего пакета Bundle в каталог документов при первом запуске, если вы планируете чтение/запись в тот же файл.

Также ваш образец JSON плох (lint). Вам нужна запятая после «Photo_0.jpeg»]

+0

Я понимаю, как преобразовать JSON в объекты данных и обратно. Как загрузить объект Collaboration, указанный в вопросе Как преобразовать Collaboration обратно в SwiftyJSON, а JSON - правильно. За элементами массива следует запятая, если они не являются последним элементом массива. – JustLearningAgain

+0

Вы запустили код, который я разместил? Если вы скопируете json в текстовый файл data.json и поместите этот файл в свой проект и вызовите функцию readJSON(), с которой она не работает (print (readJSON) показывает nil), но если вы добавите запятую, она будет работать, и вы получите полный JSON-объект в консоли. –

+0

Проблема в том, что он не отвечает на вопрос: вопрос заключается в том, как преобразовать следующие данные элемента: collaborationDictionary: [String: Set ] от SwiftyJSON (SJ) и преобразуйте его обратно в SJ. Как вы можете видеть из моего кода, я уже загружаю файл в объект данных. Я просто не могу понять, как получить данные SwiftyJSON в var collaborationDictionary: [String: Set ]. Кроме того, я не поставил фактический код написания файла, но это также довольно просто. Я просто не могу понять, как поместить сотрудничество в Word SwiftyJSON. By SwiftyJSON, я имею в виду объект JSON. – JustLearningAgain

Смежные вопросы