1. ホーム

[解決済み】SwiftでJSONファイルを読み込む

2022-04-17 09:47:27

質問

私は、JSONファイルをSwiftに読み込んで、それを弄ることができるようにしようとすることに本当に苦労しています。私は2日間の大部分を費やして、再検索と異なる方法を試していますが、まだ運がないので、私は誰かが正しい方向に私を指すことができるかどうかを確認するためにStackOverFlowにサインアップしています。

私のJSONファイルはtest.jsonと呼ばれ、以下の内容を含んでいます。

{
  "person":[
     {
       "name": "Bob",
       "age": "16",
       "employed": "No"
     },
     {
       "name": "Vinny",
       "age": "56",
       "employed": "Yes"
     }
  ]
}    

ファイルはドキュメントに直接保存されているので、以下のコードでアクセスしています。

let file = "test.json"
let dirs : String[] = NSSearchPathForDirectoriesInDomains(
                                                          NSSearchpathDirectory.DocumentDirectory,
                                                          NSSearchPathDomainMask.AllDomainMask,
                                                          true) as String[]

if (dirs != nil) {
    let directories: String[] = dirs
    let dir = directories[0]
    let path = dir.stringByAppendingPathComponent(file)
}

var jsonData = NSData(contentsOfFile:path, options: nil, error: nil)
println("jsonData \(jsonData)" // This prints what looks to be JSON encoded data.

var jsonDict = NSJSONSerialization.JSONObjectWithData(jsonData, options: nil, error: nil) as? NSDictionary

println("jsonDict \(jsonDict)") - This prints nil..... 

もし誰かが、JSONファイルをデシリアライズして、アクセス可能なSwiftオブジェクトに置くことができる方法について、正しい方向への一押しを与えてくれるなら、私は永遠に感謝します!

よろしくお願いします。

Krivvenz.

解決方法は?

以下のコードに従ってください。

if let path = NSBundle.mainBundle().pathForResource("test", ofType: "json")
{
    if let jsonData = NSData(contentsOfFile: path, options: .DataReadingMappedIfSafe, error: nil)
    {
        if let jsonResult: NSDictionary = NSJSONSerialization.JSONObjectWithData(jsonData, options: NSJSONReadingOptions.MutableContainers, error: nil) as? NSDictionary
        {
            if let persons : NSArray = jsonResult["person"] as? NSArray
            {
                // Do stuff
            }
        }
     }
}

配列 "persons"には、キーとなる人物に関するすべてのデータが格納されます。それを取得するために反復処理します。

Swift 4.0。

if let path = Bundle.main.path(forResource: "test", ofType: "json") {
    do {
          let data = try Data(contentsOf: URL(fileURLWithPath: path), options: .mappedIfSafe)
          let jsonResult = try JSONSerialization.jsonObject(with: data, options: .mutableLeaves)
          if let jsonResult = jsonResult as? Dictionary<String, AnyObject>, let person = jsonResult["person"] as? [Any] {
                    // do stuff
          }
      } catch {
           // handle error
      }
}