2017-01-01 14 views
0

JSONライブラリを使用してデータを保存しようとしています。SwiftyJSONを使用してJSONデータを保存する方法

var jsonFile = "json.json" 

class ViewController: UIViewController { 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     let jsonFile = "file.json" 
     let jsonArray:JSON = [ 
      "array": [12.34, 56.78], 
      "users": [ 
       [ 
        "id": 987654, 
        "info": [ 
         "name": "jack", 
         "email": "[email protected]" 
        ], 
        "feeds": [98833, 23443, 213239, 23232] 
       ], 
       [ 
        "id": 654321, 
        "info": [ 
         "name": "jeffgukang", 
         "email": "[email protected]" 
        ], 
        "feeds": [12345, 56789, 12423, 12412] 
       ] 
      ] 
     ] 



     if let dir = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first 
     { 
      let path = dir.appendingPathComponent(jsonFile) 

      if(!FileManager.default.fileExists(atPath: path.path)) 
      { 
       FileManager.default.createFile(atPath: path.path, contents: Data(), attributes: nil) 
       print("Created file") 

       do { 
        try write(json: jsonArray, to: path) 
       } catch let error{ 
        print("Error: \(error.localizedDescription)") 
       } 

       try! write(json: jsonArray, to: path) 
      } else { 
       print("File existed") 
       do { 
        let myJSON = try readJSON(myURL: path) 
        if let _ = myJSON 
        { 
         print("Got data") 
        } else { 
         print("No Data") 
        } 
       } catch let errorOne { 
        print("Error2: \(errorOne.localizedDescription)") 
       } 
      } 
     } 
    } 


} 
let url = Bundle.main.url(forResource: "json", withExtension: "json") 


func readJSON(myURL:URL) throws -> JSON? { 

    if let dir = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first 
    { 
     let path = dir.appendingPathComponent(jsonFile) 

     if(!FileManager.default.fileExists(atPath: path.path)) 
     { 
      let data = try Data(contentsOf: path, options: .alwaysMapped) 
      return JSON(data: data) 
     } 
    } 
    return nil 
} 

func write(json: JSON, to url: URL) throws { 
    let data = try json.rawData() 
    if let dir = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first 
    { 
     let path = dir.appendingPathComponent(jsonFile) 

     if(!FileManager.default.fileExists(atPath: path.path)) 
     { 
      try data.write(to: path) 
     } 
    } 
} 

あなたが初めてプログラムを実行すると、それはファイルを作成し、「jsonArrayを書き込み」:ここで、現時点での私のコードです。再度実行すると、JSONデータが読み込まれます。

readJSON(myURL: path)の返される値はnilに等しいという問題があります。

ios 10.2でSwiftyJSONを使用してJSONデータを読み書きするにはどうすればよいですか?

更新

私はiPhone 6sシミュレータで自分のアプリケーションを実行し、保存したファイルjson.jsonをチェックしています。保存されたファイルは次のとおりです。

{"array":[12.34,56.78],"users":[{"id":987654,"info":{"name":"jack","email":"[email protected]"},"feeds":[98833,23443,213239,23232]},{"id":654321,"info":{"name":"jeffgukang","email":"[email protected]"},"feeds":[12345,56789,12423,12412]}]} 
+0

エラーを処理するのに 'try-catch'を使わないのはなぜですか?それとは別に、ドキュメントディレクトリ内のファイルが存在する場合でも、JSONを作成するのはかなり効果がありません。 – vadian

+0

@vadianこれは、ライブラリで遊ぶための単なるコードです。このコードはプロジェクトでは使用されません。 JSONデータを保存して読み込む方法を知りたいだけです。また、私のプログラムはクラッシュしていません。それは単にnilを返します。 – iProgram

+0

'try-catch'は例外/クラッシュをキャッチしません**。エラーを報告します。すべての場合に使用することを強く推奨します。エラーが発生する可能性があります。コードをデバッグします。ブレークポイントを設定します。デバッガを使用します。 – vadian

答えて

0

私は問題の内容に丁度関心を持っています。 readJSON()関数で

func readJSON(myURL:URL) throws -> JSON? { 

    if let dir = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first 
    { 
     let path = dir.appendingPathComponent(jsonFile) 

     if(!FileManager.default.fileExists(atPath: path.path)) 
     { 
      let data = try Data(contentsOf: path, options: .alwaysMapped) 
      return JSON(data: data) 
     } 
    } 
    return nil 
} 

if(!FileManager.default.fileExists(atPath: path.path))if(FileManager.default.fileExists(atPath: path.path))されているべきです。

以前は、ファイルが存在しない場合にのみデータをロードしていました。

関連する問題