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});