tanamonの稀に良く書く日記

KEEP CALM AND DRINK BEER

WicketでJSONデータを返却する(JSONIC編)

追記:
コメントいただきまして、バージョン1.2.0で以下の問題点

Mavenリポジトリ公開されることと、ISO8601形式の出力指定ができれば僕の用途的には完璧。

の両方に対応していました。ステキすぎる!

mavenの指定

JSONICMavenリポジトリが公開されていないので、まずはローカルリポジトリに登録する

mvn install:install-file -Dfile=jsonic-1.1.2.jar -DgroupId=net.arnx -DartifactId=jsonic -Dversion=1.1.2 -Dpackaging=jar -DgeneratePom=true

あるいは、Maven2でテキトウに社内リポジトリを作る方法 - tanamonの日記に従ってテキトウに社内リポジトリに登録します。
登録したらpom.xmlに追記します。

<dependency>
	<groupId>net.arnx</groupId>
	<artifactId>jsonic</artifactId>
	<version>1.1.2</version>
</dependency>

JsonicPage.java

package jp.tanamon.wicket;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import net.arnx.jsonic.JSON;
import net.arnx.jsonic.JSONHint;

import org.apache.commons.lang.time.DateUtils;
import org.apache.wicket.IRequestTarget;
import org.apache.wicket.RequestCycle;
import org.apache.wicket.markup.html.WebPage;

public class JsonicPage extends WebPage {
	public JsonicPage() {

		getRequestCycle().setRequestTarget(new IRequestTarget() {

			public void detach(RequestCycle requestCycle) {
				// nothing to do here
			}

			public void respond(RequestCycle requestCycle) {
				requestCycle.getResponse().setContentType("application/json; charset=utf-8");

				List<JsonData> list = new ArrayList<JsonData>();
				list.add(new JsonData("All Day Event", new Date(), null));
				list.add(new JsonData("Long Event", DateUtils.setDays(new Date(), 2), DateUtils.setDays(new Date(), 10)));

				// POJO to JSON-String
				requestCycle.getResponse().write(JSON.encode(list, true));
			}
		});
	}

	public class JsonData {
		private static final String ISO8601_DATE_FORMAT = "yyyy-MM-dd'T'HH:mm:ss+09:00";

		public String title;

		@JSONHint(format = ISO8601_DATE_FORMAT)
		public Date start;

		@JSONHint(format = ISO8601_DATE_FORMAT)
		public Date end;

		public JsonData(String title, Date start, Date end) {
			this.title = title;
			this.start = start;
			this.end = end;
		}
	}
}

出力内容

[
	{
		"end": null,
		"start": "2009-12-08T11:06:18+09:00",
		"title": "All Day Event"
	},
	{
		"end": "2009-12-10T11:06:18+09:00",
		"start": "2009-12-02T11:06:18+09:00",
		"title": "Long Event"
	}
]

メモ

  • アノテーションで動作制御ができる
  • POJOはpublicフィールドでもOK
  • JSONHintアノテーションでDateクラスを変換できるけど、SimpleDateFormatではISO8601形式に出力できないので"+09:00"という残念な指定になる
  • 上記問題の回避のためにjson-lib版と同様にDateFormatUtilsを使うには、JSONクラスを継承させて、preformatメソッドで自前で記述する
  • JSON.encodeメソッドの第二引数にtrueを指定すると、JSONが読みやすく整形されてステキ

結局、json-libとJSONICのどっちがいいの?

JSONICのほうが優しさがある。
Mavenリポジトリ公開されることと、ISO8601形式の出力指定ができれば僕の用途的には完璧。