JSON in Datei speichern und wieder lesen

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • JSON in Datei speichern und wieder lesen

    Hi,

    zu Backupzwecken und zum Übertragen von Einstellungen möchte ich Daten als JSON per Mail als Anhang verschicken und als Datei auch wieder einlösen können.

    Das Verschicken klappt auch wunderbar, ich kann mir die E-Mail schicken und im Anhang ist auch mein JSON als Datei so drin, wie ich es möchte.
    Aber beim Einlesen hapert es noch ein wenig.

    Ich habe das so eingerichtet, dass ich aus der Mail-App den Anhang auswählen und an meine App übergeben kann. Auch das funktioniert und der Anhang steht mir im Programm zu Verfügung.
    Wenn ich ihn die Datei dann öffne und mir Anschaue, dann steht da nur leider nicht das drin, was ich erwarte. Ich nehmen mal an, dass liegt am encoding.

    Datei erstellen mache ich so:

    Quellcode

    1. let jsonData = try NSJSONSerialization.dataWithJSONObject(Dict, options: [])
    2. let jsonString = NSString(data: jsonData, encoding: NSUTF8StringEncoding)! as String
    3. self.saveBackupStringToFile(jsonString)



    Dann ist in der Datei, wenn ich sie mal auf dem Mac öffne das hier:

    Quellcode

    1. {"2":{"Elements":{"28-00044e3ba3ff":{"icon":"shc-icon-ds18x20","function":"","max":"","cellheight":44,"avg":"","found":1,"val":"","type":"DS18x20","name":"Wohnzimmer","temp":"24,2 °C","buttontext":0,"id":"28-00044e3ba3ff","power":"","sortkey":0,"formattype":0,"min":"","alti":"","energy":"","hum":"","press":"","state":0},"19":
    2. ... usw
    Die Datei dann wieder öffnen in der App mache ich so:

    Quellcode

    1. func getBackupFileUrl() -> NSURL {
    2. let documentsUrl = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask).first
    3. do {
    4. let directoryContent = try NSFileManager.defaultManager().contentsOfDirectoryAtURL(documentsUrl!, includingPropertiesForKeys: nil, options: NSDirectoryEnumerationOptions())
    5. restoreTextView.text = String(directoryContent)
    6. for file in directoryContent
    7. {
    8. let datei = String(file)
    9. print(datei)
    10. if datei.rangeOfString("backup.shc") != nil {
    11. return file
    12. }
    13. }
    14. } catch {
    15. }
    16. return NSURL()
    17. }
    18. @IBAction func restoreButtonAction(sender: UIButton) {
    19. var error: NSError
    20. let filedata = getBackupFileUrl()
    21. let datei = NSData(contentsOfURL: filedata)
    22. // Dieser Block ist nur um den Inhalt mal in ein TextView zu kopieren
    23. do {
    24. let inhalt = try NSString(contentsOfURL: filedata, encoding: NSUTF8StringEncoding) as? String
    25. self.restoreTextView.text = inhalt
    26. } catch {
    27. print("Fehler bei lesen von inhalt")
    28. }
    29. // Ende Testblock
    30. if datei != nil {
    31. do {
    32. let Dict = try NSJSONSerialization.JSONObjectWithData(datei!, options: [.AllowFragments]) as! NSDictionary
    33. print(Dict)
    34. let version = Dict["Version"] as! Double
    35. print("Version: \(version)")
    36. } catch {
    37. print("Fehler beim Serialisieren: \(error)")
    38. }
    39. }
    40. print("restoreBackupData")
    41. deleteOldBackupFiles()
    42. restoreButton.enabled = false
    43. }
    Alles anzeigen
    Ja, sieht ein bisschen vermasselt aus.
    Aber in der Variable "Inhalt" bzw. in meinem Textview habe ich dann sowas:

    Quellcode

    1. <7b223222 3a7b2245 6c656d65 6e747322 3a7b2232 382d3030 30343465 33626133 6666223a 7b226963 6f6e223a 22736863 2d69636f 6e2d6473 31387832 30222c22 66756e63 74696f6e 223a2222 2c226d61 78223a22 222c2263 656c6c68 65696768 74223a34 342c2261 7667223a 22222c22 666f756e 64223a31 2c227661 6c223a22 222c2274 79706522 3a224453 31387832 30222c22 6e616d65 223a2257 6f686e7a 696d6d65 72222c22 74656d70 223a2232 342c3220 c2b04322 2c226275 74746f6e 74657874 223a302c 22696422 3a223238 2d303030 34346533 62613366 66222c22 706f7765 72223a22 222c2273 6f72746b 6579223a 302c2266 6f726d61
    2. ... usw.
    Irgendwas mach ich beim Einlesen wohl falsch. Könnt ihr mir mal auf die Sprünge helfen?

    Danke. Gruß Dieter
  • gritsch schrieb:

    warum arbeitest du mit NSStrings und nicht direkt mit NSData?
    Naja, mach ich ja in Zeile 21.
    Und den Inhalt versuch in Zeile 32 in mein Dictionary zu speichern, was aber nicht funktioniert hat.

    Deswegen hab ich ja das hier gemacht:

    Quellcode

    1. do {
    2. let inhalt = try NSString(contentsOfURL: filedata, encoding: NSUTF8StringEncoding) as? String
    3. self.restoreTextView.text = inhalt
    4. } catch {
    5. print("Fehler bei lesen von inhalt")
    6. }
    um mir den Inhalt erst mal als Text in meinem Textview ausgeben zu lassen.

  • Und das mache ich doch. Oder meinst du für das Laden in das TextView?

    Quellcode

    1. var error: NSError
    2. let filedata = getBackupFileUrl()
    3. let datei = NSData(contentsOfURL: filedata)
    4. // Dieser Block ist nur um den Inhalt mal in ein TextView zu kopieren
    5. do {
    6. let inhalt = try NSString(contentsOfURL: filedata, encoding: NSUTF8StringEncoding) as? String
    7. self.restoreTextView.text = inhalt
    8. } catch {
    9. print("Fehler bei lesen von inhalt")
    10. }
    11. // Ende Testblock
    12. if datei != nil {
    13. do {
    14. let Dict = try NSJSONSerialization.JSONObjectWithData(datei!, options: [.AllowFragments]) as! NSDictionary
    15. print(Dict)
    Alles anzeigen
    Ich hole mir den Inhalt von der Datei als NSData in die Variable "dabei"
    aus dieser Variable will ich in Zeile 14 aus dem JSON mein Dictionary machen.

    Das schlägt mit folgernder Fehlermeldung fehl:
    Fehler beim Serialisieren: Error Domain=NSCocoaErrorDomain Code=3840 "Invalid value around character 0." UserInfo={NSDebugDescription=Invalid value around character 0.}
    (lldb)

    Darauf hin habe ich mir den Block eingefügt, der mir den Inhalt der Datei ebenso in der Variable "inhalt" (ist ein blöder Name für eine Variable) speichert, aber halt als NSString, denn wie soll ich ihn sonst in das Textview bekommen.

    Hier noch mal ein paar Screenshots.
    Dateien
    • NSData1.png

      (118,91 kB, 152 mal heruntergeladen, zuletzt: )
    • NSData2.png

      (152,72 kB, 152 mal heruntergeladen, zuletzt: )