Разбор JSON-объектов неизвестного типа с помощью AutoBean в GWT - PullRequest
6 голосов
/ 11 февраля 2012

Мой сервер возвращает список объектов в формате JSON.Например, они могут быть Cat с или Dog с.

Когда я знаю, что все они будут Cat с, я могу легко настроить AutoBeanCodex на работу.Когда я не знаю, что это за типы, хотя ... что мне делать?

Я мог бы дать всем своим сущностям поле типа, но тогда мне пришлось бы анализировать каждую сущность, прежде чем передавать еедо AutoBeanCodex, который граничит с победой над точкой.Какие еще варианты у меня есть?

1 Ответ

8 голосов
/ 11 февраля 2012

Только что поиграл с этим на днях и боролся с ним несколько часов, пробуя методы @Category и другие, пока не обнаружил следующее: вы можете создать свойство типа Splittable, которое представляет базовый транспортТип, который имеет некоторую кодировку для логических / Strings / Lists / Maps.В моем случае я знаю какой-то обволакивающий тип, который проходит через провод во время разработки, и, основываясь на каком-то другом свойстве, некоторым другим полем может быть любое количество других автобинов.

Вам даже не нужно знатьтип другого bean-компонента во время компиляции, вы можете получить значения, используя методы Splittable, но, в любом случае, если вы используете autobean-компоненты, неплохо определить обернутые данные.

interface Envelope {
  String getStatus();
  String getDataType();
  Splittable getData();
}

(Сеттеры могут быть желательны, если вы отправляете данные, а также получаете их - кодирование bean-компонента в `Splittable 'для отправки его в конверте даже проще, чем его декодирование)

JSON, отправленный по сети, декодируется (возможно, сAutoBeanCodex) в тип Envelope, и после того, как вы определили, какой тип должен выходить из метода getData(), вызовите что-то вроде этого, чтобы получить вложенный объект

SpecificNestedBean bean = AutoBeanCodex.decode(factory, 
                                               SpecificNestedBean.class, 
                                               env.getData()).as();

.Тип Envelope и вложенные типы (в factory выше) даже не обязательно должны быть одного типа AutoBeanFactory.Это может позволить вам абстрагироваться от чтения / записи конвертов из общего экземпляра транспорта и использовать конкретную фабрику для каждого строкового свойства dataType для декодирования модели данных (и вложенных моделей).

...