playframework .json шаблон Список объектов с foreach? - PullRequest
3 голосов
/ 28 января 2012

Моя проблема: я не хочу возвращать всю структуру объекта модели и данные в ответе json. renderJSON () возвращает все из модели в ответе.

Так что я подумал, что лучше всего использовать шаблоны * .json. Хорошо, теперь у меня есть список, и я не знаю, каким должен быть синтаксис в шаблоне * .json.

Часть контроллера:

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?

Ответы [ 2 ]

4 голосов
/ 28 января 2012

Существует другое решение вашей проблемы без использования шаблона .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 использует GSON от Googleбиблиотека для сериализации / десериализации json Более подробную информацию о GSON можно найти здесь

2 голосов
/ 28 января 2012
[
#{list users}
  {
      "username": "${_.name}",
      "userdescr": "${_.description}"
  } #{if !_isLast},#{/if}
#{/list}
]

Проверьте http://www.playframework.org/documentation/1.2.4/tags#list для получения дополнительной информации

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...