連載
» 2013年09月25日 18時00分 UPDATE

Scala+Play 2.0でWebアプリ開発入門(9):Play2におけるJSONおよびCoffeeScriptの使い方 (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)
       1|2|3 次のページへ

Copyright© 2017 ITmedia, Inc. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。