播放框架.json模板List-Objects with foreach?

时间:2012-01-27 21:05:48

标签: json templates foreach playframework

我的问题是:我不想在json响应中返回整个模型对象结构和数据。 renderJSON()返回响应中模型的所有内容。

所以我认为最好的方法是使用* .json模板。好的,现在我有一个List,我现在不知道* .json-template中的语法必须如何。

控制器的一部分:

List<User> users = User.find("byActive", true).fetch();
if (users != null) {
    render(users);
}

“User / showAll.json”(模板):

//something like foreach( User currentUser in users )
{
    "username": "${currentUser.name}",
    "userdescr": "${currentUser.description}"
}

对于单个用户来说没问题,我知道了,但是json模板中的用户列表看起来怎么样?

2 个答案:

答案 0 :(得分:4)

如果不使用.json模板,还有另一种解决方案。

“renderJSON()”有一个变量以JsonSerializer作为参数,因此您可以定义自己的序列化器来实现JsonSerializer,并决定在响应中发送哪个模型对象部分。然后你可以调用renderJSON()来返回控制器中的JSON对象。

示例:

public class UserSerializer implements JsonSerializer<User> {

    public JsonElement serialize(User src, Type typeOfSrc, JsonSerializationContext context) {
        Gson gson = new GsonBuilder()
            .setExclusionStrategies(new LocalExclusionStrategy()).create();
        return gson.toJsonTree(src);
    }   

    public static class LocalExclusionStrategy implements ExclusionStrategy {
        public boolean shouldSkipClass(Class<?> clazz) {
            return false;
        }   

        public boolean shouldSkipField(FieldAttributes f) {
            // add exlusion rules here:
            // exclude all fields whose name is not "name" or "description" 
            return !f.getName().toLowerCase().equals("name")
                && !f.getName().toLowerCase().equals("description");
        }   
    }   
}

在您的控制器中:

List<User> users = User.find("byActive", true).fetch();
renderJSON(users, new UserSerializer());

Play框架利用Google的GSON库进行json序列化/反序列化 你可以找到更多关于GSON here

的信息

答案 1 :(得分:2)

[
#{list users}
  {
      "username": "${_.name}",
      "userdescr": "${_.description}"
  } #{if !_isLast},#{/if}
#{/list}
]

检查http://www.playframework.org/documentation/1.2.4/tags#list以获取更多信息