2012-02-10 12 views
6

Mi servidor devuelve una lista de objetos en JSON. Pueden ser Cat so Dog s, por ejemplo.Analizando objetos JSON de tipo desconocido con AutoBean en GWT

Cuando sé que todos serán Cat s, puedo configurar AutoBeanCodex para que funcionen fácilmente. Cuando no sé qué tipo son, sin embargo ... ¿qué debo hacer?

Podría dar a todas mis entidades un campo de tipo, pero luego tendría que analizar cada entidad antes de pasarla al AutoBeanCodex, que bordea al derrotar el punto. ¿Qué otras opciones tengo?

Respuesta

8

Acabo de jugar con esto el otro día, y luché por unas horas, probando @Category métodos y otros, hasta que encontré esto: Puede crear una propiedad de tipo Splittable, que representa el tipo de transporte subyacente que tiene alguna codificación para booleanos/cadenas/listas/mapas. En mi caso, conozco algún tipo envolvente que supera el cable en el momento del diseño, y en función de alguna otra propiedad, otro campo puede ser cualquier cantidad de autoboyas.

Ni siquiera necesita saber el tipo de otro bean en el momento de la compilación, puede obtener valores usando los métodos Splittable, pero si usa autobeans de todos modos, es bueno definir los datos que se envuelven.

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

(cabría desear Setter si el envío de datos, así como recieving - codifica un frijol en un `divisible para enviar en un sobre es incluso más fácil que descodificarlo)

El JSON enviada a través de alambre se decodifica (probablemente utilizando AutoBeanCodex) en el tipo Envelope, y después de que haya decidido qué tipo debe estar saliendo del método getData(), llamar algo como esto para conseguir el objeto anidado cabo

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

el Envelope tipo y los tipos anidados (en factory arriba) ni siquiera tienen que ser del mismo tipo AutoBeanFactory. Esto podría permitirle abstraer la lectura/escritura de sobres desde la instancia de transporte genérica, y usar una fábrica específica para cada propiedad de cadena dataType para decodificar el modelo de datos (y modelos anidados).