我的问题是:我不想在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模板中的用户列表看起来怎么样?
答案 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以获取更多信息