Play2におけるJSONおよびCoffeeScriptの使い方:Scala+Play 2.0でWebアプリ開発入門(9)(1/3 ページ)
2.0からScalaに対応したWebアプリ開発の人気軽量フレームワーク「Play」について解説し、Webアプリの作り方を紹介する入門連載。今回は、JSONを扱うためのパッケージやJSONとScalaの相互変換の方法、JsPathの使い方、CoffeeScriptの使い方などを解説します。
前回の記事「Playのグローバルな設定&spec2でBDDなテスト」では、Play framework 2.x(以下、Play2)でのテスト手法を紹介しました。
ここまでの連載で、Scalaで使うことを中心に、Play2の概要からコンソールの使用方法、コントローラやビュー、DBアクセス方法やテスト手法など、Play2における基本的な機能について説明してきました。しかしPlay2の機能は、まだまだあります。今回は、そういったPlay2のいろいろな機能を紹介します。
JSONを扱うためのライブラリ「play.api.libs.json」パッケージ
最近はHTMLのフォームを使って画面遷移やデータの送受信をするより、Ajaxでデータの送受信を行い、最初にロードされたページの内容を変更していくことの方が多いかもしれません。
このようなアプリは「単一ページアプリケーション(single page application)」とも呼ばれ、サーバ側はRESTでアクセス可能な状態で用意し、クライアントはAjaxを使用してサーバと通信します。
この場合、送受信フォーマットはJSONを使用することが多いのではないでしょうか。Play2では、「play.api.libs.json」パッケージにJSONを扱うためのライブラリが用意されています。ここからは、Scala+Play2でJSONを扱う方法を紹介していきます。
JSONでレスポンスを返してみる
JSON形式でレスポンスを返してみましょう。いままでの連載でも使用してきた「gyro」プロジェクトで、「app/controllers」に「JsonController.scala」を追加します。
package controllers import play.api._ import play.api.mvc._ import play.api.libs.json.Json object JsonController extends Controller { def simpleJson = Action { val result = Map("status" -> "success") val json = Json.toJson(result) Ok(json) } }
シンプルなJSONを返すのであれば、上記のような簡単な方法で実現できます。MapオブジェクトをJson.toJsonへ渡し、JsValuesオブジェクトを返しています。
※JsValuesを返す場合、Content-Typeヘッダには適切な値(application/json)が設定されます
次はroutesファイルに、上記コントローラのルート情報を追加します。
GET /simpleJson controllers.JsonController.simpleJson()
Playコンソールを起動して動作を確認してみましょう。runコマンドでアプリを起動し、「http://localhost:9000/simpleJson」にアクセスしてみてください。画面に次のような結果がJSON形式で返ってきます。
{"status":"success"}
上の例では、コントローラでScalaのMapオブジェクトをシリアライズしてJSON形式にしています。この方法以外にも、次のようにJSON形式の文字列として返しても問題ありません。
val jsonStr = """{ "status": "success" }""" Ok(jsonStr).withHeaders(CONTENT_TYPE -> "application/json")
ScalaからJSON用のデータ型を使用する
JsonオブジェクトのtoJson関数を使用すれば、ScalaからJSONへデータを変換できます。JSONの仕様では、文字列や数値、bool値、null、他のJSONオブジェクト、配列を使用可能ですが、play.api.libs.jsonパッケージには、このJSON構造に対応したデータ型がそれぞれ含まれています。
これらオブジェクトは、すべて「JsValue」というクラスを継承したcaseクラスになっており、インスタンス化することで、任意のJSONデータを構築できます。
では各JSONオブジェクトについて簡単に解説しておきましょう。なお、例にあるサンプルコードは、Playコンソール上でconsoleコマンドを実行して確認しています。
文字列:JsString
標準的な文字列です。JSONオブジェクト内の文字列を表すために使用します。
scala> import play.api.libs.json.JsString scala> val jStr = JsString("taro")
数値:JsNumber
JSONオブジェクト内における数値を表します。引数はBigDecimal型を受け取るので、整数や少数を渡すことができます。
scala> import play.api.libs.json.JsNumber scala> val jNum = JsNumber(10.5)
真偽値:JsBoolean
true/falseの値を取る真偽値を表します。
scala> import play.api.libs.json.JsBoolean scala> val jBool = JsBoolean(true)
null:JsNull
JSONオブジェクト内におけるnullを表現します。
scala> import play.api.libs.json.JsNull scala> val nullObj = JsNull
JSONオブジェクト:JsObject
JSONオブジェクトを表す、キー・バリューのセットです。引数として「Seq[String,JsValue]」を受け取ります。例えば、「{ "name" : "taro", "age" : 30, "enable" : true }」と表されるJSONは、JsObjectで次のように表現されます。
scala> import play.api.libs.json.JsObject scala> val jsObj = JsObject( "name" -> JsString("taro") :: "age" -> JsNumber(30) :: "enable" -> JsBoolean(true) :: Nil)
JSONオブジェクトの配列:JsArray
JSONオブジェクトにおける配列を表します。JsArrayはSeq[JsValue]を受け取ります(配列の要素は同じ型である必要はないです)。例えば、JSON内で「["taro", 100, true]」と表される配列は、下記のように作成できます。
scala> import play.api.libs.json.JsArray scala> val jsArray = JsArray( JsString("taro"):: JsNumber(100) :: JsBoolean(true):: Nil)
Copyright © ITmedia, Inc. All Rights Reserved.