このページの本文へ

XMLとJSONを解析するiPhoneアプリの作り方

2015年09月17日 11時00分更新

森 巧尚

  • この記事をはてなブックマークに追加
本文印刷

2. JSONを解析する方法

JSONの解析にはSwiftの命令「NSJSONSerialization.JSONObjectWithData」を使います。

NSJSONSerialization.JSONObjectWithDataは、ダウンロードしたJSONデータをSwiftで使える形式に解析し、変換します。XMLと違いデータ構造に応じた解析プログラムを作る必要がありません。

ただし、機械的にJSONデータに変換しているので、データ利用時には必ずデータを厳重にチェックする必要があります。

XMLデータのような複雑な解析プログラムが不要なのはメリットですが、データが意図通りに変換されているかチェックしながら利用するデメリットもあります。

1)Xcodeのメニュー「File」→「New」→「Project」から「Single View Application」を選択して、新規プロジェクトを作成しましょう。

2)ダウンロード用のテキストデータ、JSONデータをWebにアップします。データ構造にあわせてプログラミングする必要があるので、今回は以下のデータを使います。


{"data":
    [
    {"name":"ダージリン","price":600},
    {"name":"アールグレイ","price":550}
    ]
}

※サンプルファイル http://editors.ascii.jp/c-minamoto/swift/swift-5-data.json で代用できます。

3)画面に[textView]と[Button]を配置して、アプリ画面を作ります。

「Main.storyboard」を選択し、右下のライブラリから[Button]と[textView]をドラッグ&ドロップして配置します。 右下の「|△|」ボタンを押して、「Reset to Suggested Constraints(自動レイアウト設定)」を選択します。

4)textViewに名前をつけてコントロールします。

メニュー「View」→「Assitant Editor」→「Show Assistant Editor」を選択して、「アシスタントエディター」を表示し、キーボードのcontrolを押しながら、[textView]をViewController.swiftへドラッグして、名前を「myTextView」とします。

ViewControll.swiftにコード、


@IBOutlet weak var myTextView: UITextView!

が追加されます。

5)ボタンが押されたときに実行される関数を作ります。

ボタンが押されたときの命令を記述するための関数を作ります。

キーボードのcontrolを押しながら「Button」をViewController.swiftへドラッグし、「Connection」を「Action」に切り換えてボタンを押したとき実行する関数を作ります。関数名は「tapBtn」にします。

6)ViewController.swiftに、プログラムを記述します。

ボタンが押されたときに、サーバーからデータをダウンロードして解析し、アプリに表示するプログラムを記述します。

テキストデータのURLを用意して、18行目「sendAsynchronousRequest」で非同期ダウンロードを実行します。データの読み込みが終わったら、22行目「dispJSON関数」が呼び出されるので、28行目「NSJSONSerialization」でJSONを解析します。

JSONデータの読み込みを確認するために、読み込み完了の合図がきたときにdispJSON関数の中で、25行目「println文」を使ってデバッグエリアへJSONデータを出力します。

その後、30、33、35、39行目で「if let」を使ってデータ構造の階層に応じてデータがあるかをチェックしながらデータをmsg変数に取り出していきます。全てのチェックが終わったら、47行目で最終的に取り出したデータを「myTextView」に表示します。

記述したプログラムは以下の通りです。


//(中略)
    @IBAction func tapBtn(sender: AnyObject) {
        let url:NSURL = NSURL(string: "http://editors.ascii.jp/c-minamoto/swift/swift-5-data.json")!
        let request = NSURLRequest(URL: url)
        // 非同期通信を開始
        NSURLConnection.sendAsynchronousRequest(request, queue: .mainQueue(), completionHandler: self.dispJSON)
    }
    // 表示するメッセージを入れる変数
    var msg:String = ""
    func dispJSON(response:NSURLResponse?, data:NSData?, error:NSError?) {
        // チェックのため、読み込んだデータをそのまま表示
        let myString = NSString(data:data!, encoding: NSUTF8StringEncoding) as! String
        println(myString)
        
        // JSONデータを辞書データに変換
        if let jsonDic = NSJSONSerialization.JSONObjectWithData(data!, options: nil, error: nil) as? NSDictionary {
            // まずキー"data"で、配列データを取り出す
            if let arrayData = jsonDic["data"] as? NSArray {
                // 配列のデータを1つずつ辞書データを取り出す
                for datN in 0..<arrayData.count {
                    if let data = arrayData[datN] as? NSDictionary {
                        // キー"name"の文字データを取り出して、msg変数に追加
                        if let nameDat = data["name"] as? String{
                            msg += "名前=\(nameDat)\n"
                        }
                        // キー"price"の数値データを取り出して、msg変数に追加
                        if let price = data["price"] as? Int{
                            msg += "価格=\(price)\n"
                        }
                    }
                }
            }
        }
        // チェックが終わったらメッセージを表示
        myTextView.text = msg
    }
//(中略)

ボタンを押すと、データが読み込まれて解析され、「textView」に表示されます。

Xcodeの下に表示されているデバッグエリアを確認してみましょう。JSONデータが読み込まれていることがわかります。

サーバーからダウンロードしたデータを解析する方法を2つ紹介しました。

簡単なデータであればXML、JSONどちらでもすぐ作れそうですが、データ構造が複雑になるとXMLデータの読み込みはプログラム複雑になってしまう欠点があります。

JSONデータだと簡単ですが、それでもデータ構造が複雑になるとチェックが大変です。

次回はライブラリを使ってもっと簡単にJSONデータを扱う方法を紹介します。また、実践的な使い方として実際に公開されているオープンデータを使って解析する方法について紹介します。

著者:森 巧尚

著者写真

パソコンが誕生した時代からミニゲームを作り続けて35年。現在ではFlashやiPhoneアプリなどのゲームコンテンツ制作、アプリの開発書などの執筆活動、関西学院大学非常勤講師などを勤める。オリジナルiPhoneアプリの受託開発なども行っている。

Web Professionalトップへ

この連載の記事

一覧へ
Web Professionalトップページバナー

この記事の編集者は以下の記事をオススメしています

ASCII.jp会員サービス 週刊Web Professional登録

Webディレクター江口明日香が行く