我的问题是:我不想在 json 响应中返回整个模型对象结构和数据。 renderJSON() 在响应中返回模型中的所有内容。
所以我认为最好的方法是使用 *.json 模板。好的,现在我有一个列表,但我现在不知道 *.json 模板中的语法必须如何。
Controller 部分:
List<User> users = User.find("byActive", true).fetch();
if (users != null) {
render(users);
}
“用户/showAll.json”(模板):
//something like foreach( User currentUser in users )
{
"username": "${currentUser.name}",
"userdescr": "${currentUser.description}"
}
对于单个用户,这没问题,我明白了,但是对于 json 模板中的用户列表,它看起来如何?
最佳答案
在不使用 .json 模板的情况下,您的问题还有另一种解决方案。
“renderJSON()”有一个以 JsonSerializer 作为参数的变体,因此您可以定义自己的实现 JsonSerializer 的序列化程序,并决定在响应中发送模型对象的哪一部分。然后您可以调用 renderJSON() 以在 Controller 中返回 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");
}
}
}
在你的 Controller 中:
List<User> users = User.find("byActive", true).fetch();
renderJSON(users, new UserSerializer());
Play 框架利用 Google 的 GSON 库进行 json 序列化/反序列化 您可以找到 GSON 的更多信息 here
关于json - 使用 foreach Play Framework .json 模板列表对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9040060/