hnakamur’s blog

ものすごい勢いで忘れる私のために未整理でもいいからとりあえずメモ

2011-06-28

SAStrutsでJSONをレスポンスに書き出すサンプル

SAStrutsでJSONをレスポンスに書き出すサンプルを作ってみました。JSONIC - simple json encoder/decoder for javaを利用しています。

アクションからの呼び出し例
    @Execute(validator = false)
    public String hello() {
        Map<String, Object> json = new HashMap<String, Object>();
        json.put("author", "Goldratt & Fox");
        json.put("title", "The Race");
        JSONResponseUtil.writeJSON(json);
        return null;
    }


ユーティリティの実装
package net.naruh.sastruts.util;

import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;

import javax.servlet.http.HttpServletResponse;

import net.arnx.jsonic.JSON;

import org.seasar.framework.exception.IORuntimeException;
import org.seasar.struts.util.RequestUtil;
import org.seasar.struts.util.ResponseUtil;

/**
 * JSONをレスポンスに書き出すためのユーティリティクラスです。
 * @author hnakamur
 */
public final class JSONResponseUtil {
    /** JSONのエンコーディング */
    public static final String JSON_ENCODING = "UTF-8";

    /** JSONのコンテントタイプ */
    public static final String JSON_CONTENT_TYPE = "application/json";

    /**
     * JSONをレスポンスに書き出します。
     * @param source 書き出すオブジェクト
     * @param prettyPrint 出力を整形するか
     */
    public static void writeJSON(Object source) {
        writeJSON(source, false, JSON_CONTENT_TYPE, null);
    }

    /**
     * JSONをレスポンスに書き出します。
     * @param source 書き出すオブジェクト
     * @param prettyPrint 出力を整形するか
     */
    public static void writeJSON(Object source, boolean prettyPrint) {
        writeJSON(source, prettyPrint, JSON_CONTENT_TYPE, null);
    }

    /**
     * JSONをレスポンスに書き出します。
     * @param source 書き出すオブジェクト
     * @param prettyPrint 出力を整形するか
     * @param contentType コンテントタイプ
     */
    public static void writeJSON(Object source, boolean prettyPrint, String contentType) {
        writeJSON(source, prettyPrint, contentType, null);
    }

    /**
     * JSONをレスポンスに書き出します。
     * @param source
     *            書き出すオブジェクト
     * @param prettyPrint
     *            出力を整形するか
     * @param contentType
     *            コンテントタイプ。 デフォルトはapplication/context。
     * @param encoding
     *            エンコーディング。 指定しなかった場合は、リクエストのcharsetEncodingが設定される。
     *            リクエストのcharsetEncodingも指定がない場合は、UTF-8。
     */
    public static void writeJSON(Object source, boolean prettyPrint, String contentType, String encoding) {
        if (contentType == null) {
            contentType = JSON_CONTENT_TYPE;
        }
        if (encoding == null) {
            encoding = RequestUtil.getRequest().getCharacterEncoding();
            if (encoding == null) {
                encoding = JSON_ENCODING;
            }
        }
        HttpServletResponse response = ResponseUtil.getResponse();
        response.setContentType(contentType + "; charset=" + encoding);
        try {
            Writer out = new OutputStreamWriter(response
                    .getOutputStream(), encoding);
            try {
                JSON.encode(source, out, prettyPrint);
            } finally {
                out.close();
            }
        } catch (IOException e) {
            throw new IORuntimeException(e);
        }
    }
}

0 件のコメント:

ブログ アーカイブ