SwiftでJSONファイルを読み込むのはかなり面倒くさくて、今回便利なライブラリを使ってJSONファイルを読み込んでみました。ゲームのステージをJSONで管理する場合を想定しています。JSONでステージ情報を構成していれば、追加ステージを配布する際にJSONファイルをダウンロードさせれば良いだけなので便利です。
JSONパーサーとして評判の良いUnboxを先に試してみたのですが何故か意図通りに動かず…今回使用したのはswift-jsonです。とても簡単に使えます。
制作環境
- Xcode7.2.1
- Swift2
- swift-json (swift-2.0)
swift-jsonのインストール
ライブラリ本体はこちらからダウンロードします。
swift-jsonの本体は、json.swiftファイルです。ダウンロードしたjson.swiftを直接プロジェクトにドラッグして追加するだけでOKです。cocoapodsを使ったインストール作業は必要ありません。
今回使用するJSONファイルの内容
下記の様な内容の追加ゲームステージをJSONで用意するイメージです。テストなので、このJSONファイルはLibraryフォルダではなく、プロジェクトのリソースに追加して読み込んでみます。
1 2 3 4 5 6 7 8 9 |
{ "stage_id": 123, "stage_name": "追加ステージタイトル", "character": [ {"x":"100","y":"300","type":"1"}, {"x":"300","y":"500","type":"3"}, ... ] } |
XcodeでSingleViewの新規プロジェクトを作成して、json.swiftとstage_001.jsonを追加しただけです。これで準備完了!

swift-jsonを使って読み込む
次の方法で、JSONファイルから各要素を取り出す事ができます。
JSONの要素を取得する際は、asIntやasStringなどを使って型を明確にしないとエラーになるので注意。ただし、配列を取得する場合はasArrayは必要ありません。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
//JSONファイルのパスを取得 if let json_path:String = NSBundle.mainBundle().pathForResource("stage_001", ofType: "json") { //パスを取得できたら… JSONデータを文字列で取得 let json_data = try! NSString(contentsOfFile: json_path, encoding: NSUTF8StringEncoding) as! String //JSONデータをパース let json = JSON.parse(json_data) //JSONの要素を取得 let stage_id = json["stage_id"].asInt //swift-jsonの規約に沿って、型を指定します。 let stage_name = json["stage_name"].asString//swift-jsonの規約に沿って、型を指定します。 print("stage_id: \(stage_id!)----stage_name: \(stage_name!)") //デバッグ用に取得した値をコンソールで確認 //JSONの配列要素を取得 let json_character_array = json["character"] for (key, value) in json_character_array{ //デバッグ用に取得した値をコンソールで確認 print("key: \(key)\n x->\(value["x"]) / y->\(value["y"]) / type->\(value["type"])") } } |
1 2 3 4 5 6 |
/*コンソールに出力される結果 stage_id: 123----stage_name: 追加ステージタイトル x->100 / y->300 / type->1 key: 1 x->300 / y->500 / type->3 */ |
これで、簡単にJSONファイルを読み込む事ができました。APIで公開されているJSONファイルを読み込む場合も基本は同じです。文字列のJSONデータではなくファイルURLを使いたい場合は、JSONデータをパースする箇所を下記の様に変えます。
1 2 |
//JSONデータをパース let json = JSON.fromURL("http://hogehoge.com/stage_001.json") |
配列は、取り出してから型変換する
配列から取り出した値はprintで出力できますが、型を調べるとJSON型となっています。このままだとtoIntなどでInt型に変換する事ができないので、JSONクラスのasIntを使って変換します。
変換というか…JSONクラスのasIntプロパティにセットされている訳ですね。
1 2 3 4 |
value["x"] //配列から取り出したままだと、JSON型 value["x"].toInt() //String型からの変換じゃないので、エラーになる value["x"].asInt //Intのオプショナル型に変換される value["x"].asInt! //アンラップされたInt型に変換される |