Slim3 で JSON を利用する

Model での記述例。

基本的には JSON を利用するのに既存の Model をそのまま使える。
しかし、JSON アノテーションで Model が保持するエンティティ内のプロパティを操作したい場合は、下記のように「org.slim3.datastore.json.Json」が必要になる。

import org.slim3.datastore.Attribute;
import org.slim3.datastore.Model;
// JSON アノテーションを利用する場合に import する
import org.slim3.datastore.json.Json;
@Model(schemaVersion = 1)
public class Article implements Serializable {

    private static final long serialVersionUID = 1L;
    // Key を JSON に出力しない
    @Attribute(primaryKey = true, json=@Json(ignore=true))
    private Key key;
    // Entity のバージョン情報も JSON に出力しない
    @Attribute(version = true, json=@Json(ignore=true))
    private Long version;

Service での記述例

public class PostService {
    private PostMeta meta = new PostMeta();

    /* 投稿日時から降順で10件の投稿を取得する既存のメソッド */
    public List<Post> getLatestPostIn10() {
        return Datastore.query(meta).sort(meta.publishedDate.desc).offset(0).limit(10).asList();
    }

    /* 追記した JSON 変換用メソッド */
    public String getLatestPostIn10AsJson() {
        List<Post> posts = getLatestPostIn10();
        // List 型の結果をオブジェクト型の配列に変換する
        Object[] entityArray = posts.toArray();
        // 「modelsToJson」と「modelToJson」の違いに注意
        // 配列を JSON に変換する場合「models」と複数形になっている
        return ArticleMeta.get().modelsToJson(entityArray);
    }

Controller の記述例

package com.example.www.controller.api.json.posts;

import com.example.www.service.PostService;

import org.slim3.controller.Controller;
import org.slim3.controller.Navigation;

public class LatestController extends Controller {

    private PostService service = new PostService();

    @Override
    public Navigation run() throws Exception {
        String json = service.getLatestPostIn10AsJson();
        requestScope("json", json);
        // 単なる JSON ではなく JSONP として利用したいので、JSP 有の Controller にしている
        return forward("latest.jsp");
    }
}

JSP の記述例

<%@page contentType="application/json;charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false" session="false"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
<%@taglib prefix="f" uri="http://www.slim3.org/functions"%>
callback(${json});