Play frameworkでJSONデータを返す

このエントリはPlay frameworkひとりアドベントカレンダーの6日目です。

さて突然ですが、時代はAPIなのでPlayのレスポンスとしてJSONを返してみましょう。

http://localhost:9000/time にアクセスしたらこんな感じのJSONを返すようにしたいです。

{ 
  "localDate":"",
    "",
    ... 
  } 
}

いまからやることは3つ!

  1. ルーティングを定義→ /conf/routes
  2. Controllerを定義→ /app/controllers/Application.java
  3. http://localhost:9000/time にアクセス!

ルーティングを定義

/conf/routes に追記します。

GET/time にアクセスがきたら、 controllers.Application#getTime を呼び出すように設定します。

GET     /time        controllers.Application.getTime()

Controllerを定義

/app/controllers/Application.java にメソッドを追加します。

Play frameworkでJsonを扱うなら、 play.libs.Json が便利です。 org.codehaus.jackson.node.ObjectNode 型を使って操作しましょう。

レスポンスはok()にJsonオブジェクトを渡すだけで、 Content-Type:application/json; charset=utf-8 でデータを返却してくれます。

もしレスポンスのContent-Typeを変更する場合は、 ok(json).as("ほげ") を利用しましょう。
例えば ok(json).as("text/json; charset=euc-jp") みたいな。

package controllers;

import java.util.Calendar;
import java.util.TimeZone;

import org.codehaus.jackson.node.ObjectNode;

import play.libs.Json;
import play.mvc.Controller;
import play.mvc.Result;

public class Application extends Controller {

	public static Result getTime() {
		ObjectNode rootJson = Json.newObject();
		rootJson.put("localDate", Calendar.getInstance(TimeZone.getDefault())
				.getTime().toString());
		rootJson.put("utcDate",
				Calendar.getInstance(TimeZone.getTimeZone("UTC")).getTime()
						.toString());

		ObjectNode timeZonesJson = Json.newObject();
		for (String timeZoneId : TimeZone.getAvailableIDs()) {
			TimeZone tz = TimeZone.getTimeZone(timeZoneId);
			timeZonesJson.put(tz.getDisplayName(), tz.getID());
		}

		rootJson.put("timeZones", timeZonesJson);

		return ok(rootJson);
	}
}

http://localhost:9000/time にアクセス!

できた!?できたかい!?カンタン!!!


See also