Предотвратить сериализацию определенных полей - PullRequest
5 голосов
/ 19 января 2011

В платформе Play у меня есть несколько моделей, у которых есть поля, которые являются объектными ссылками на другие модели. Когда я использую renderJSON, я не хочу, чтобы эти ссылки на объекты были включены. В настоящее время для моих нужд я создаю отдельный класс модели представления, который содержит поля, которые я хочу, и в контроллере я создаю экземпляры этого класса представления по мере необходимости. В идеале я хотел бы иметь возможность использовать сам класс модели без необходимости писать класс представления.

Есть ли способ аннотировать поле, чтобы оно не было сериализовано при использовании renderJSON?

Ответы [ 4 ]

11 голосов
/ 19 января 2011

, поскольку play использует Gson для сериализации Json, вы можете попробовать следующее:

public static void test()  
{  
    Object foo = new SomeObject("testData");  
    Gson gson = new GsonBuilder()
        .excludeFieldsWithModifiers(Modifier.TRANSIENT)  
        .create();
    renderJSON(gson.toJson(foo));  
}

теперь каждое поле, помеченное как переходное, не будет сериализовано. Есть и другой (лучший) способ. Вы можете использовать аннотацию com.google.gson.annotations.Expose, чтобы отметить каждое поле, которое вы хотите сериализовать.

public static void test()  
{  
    Object foo = new SomeObject("testData");  
    Gson gson = new GsonBuilder()
        .excludeFieldsWithoutExposeAnnotation()  
        .create();
    renderJSON(gson.toJson(foo));  
}
2 голосов
/ 17 июня 2011

Использование FlexJSON с игрой - это еще один вариант, описанный в этой статье: http://www.lunatech -research.com / archives / 2011/04/20 / play-framework-better-json-serialization -flexjson

0 голосов
/ 04 ноября 2014

Не знаю, почему никто не написал самое прямое решение для этого ответа, поэтому я сделаю это здесь:

Просто пометьте поля, которые вы не хотите сериализовать через Gson, как transient.

Вот пример:

public class Animal
{
        private String name = "dog";
        transient private int port = 80;
        private String species = "canine";
        transient private String password = "NoOneShouldSeeThis";
}

Ни один из предметов, помеченных как временные, не будет сериализован. После десериализации они будут установлены в значения по умолчанию (класс по умолчанию).

Результирующий JSON будет выглядеть следующим образом:

{"name":"dog","species":"canine"}

Для получения дополнительной информации о переходных процессах вы можете увидеть SO Почему в Java есть переходные поля?

0 голосов
/ 19 января 2011

Я бы переопределил renderJSON, чтобы проверить имя поля по отношению к массиву элементов исключений сериализации.

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