2013-03-02 4 views
2

Когда у меня есть объект, как этотGson сериализации боб

class Foo 
{ 
    private String Bar = "someBarValue"; 
} 

и следующее заявление

String json = new Gson().toJson(new Foo()); 

результаты в { "bar" : "someBarValue"}

У меня есть много классов, которые следуют стандартной Java Bean Конвенция

class FooBean 
{ 
    String getBar() { return "someBarValue"; } 
} 

и следующее заявление

String json = new Gson().toJson(new FooBean()); 

приводит {}

Как я могу сериализовать (и в конце концов десериализации, если у меня есть сеттеры) FooBean из приведенного выше примера, используя Gson без необходимости полагаться на частные переменные-члены класса?

ответ

4

Это невозможно на сегодняшний день. Посмотрите Gson Design Document:

Использования поле против добытчиков, чтобы указать JSon элементов

Некоторых библиотеки JSon используют методы получения такого типа, чтобы вывести элементы JSon. Мы решили использовать все поля (вверху иерархии наследования), которые не являются временными, статическими или синтетическими. Мы сделали это, потому что не все классы написаны с подходящими именами. Более того, getXXX или isXXX могут быть семантическими, а не отображающими свойствами.

Однако есть хорошие аргументы в поддержку свойств. Мы намерены усилить Gson в последней версии, чтобы поддерживать свойства как альтернативное отображение для указания полей Json. На данный момент Gson основан на полях.

Еще одна вещь, которую вы можете рассмотреть, - это концепция сериализации/десериализации: почему бы сериализовать/десериализовать объект? В общем, иметь копию его после настойчивости, связь (т. Е. В основном ввод-вывод). Имеет смысл не полагаться на геттеры и сеттеры для этого. Они могут изменять содержимое объектов, и поэтому сериализация/десериализация не будут достигать того, для чего они были созданы.

+0

Прямо сейчас я понял, что эта тема освещена здесь: http://stackoverflow.com/questions/6203487/why-does-gson-use-fields-and-not-getters-setters Итак, давая кредит кому-то который ответил первым. – Viccari