2012-08-29 42 views
6

Tengo una lista de los objetos JavaScript en mi lado del cliente, que son una lista de "eventos" que un usuario ha ejecutado. Cuando el usuario está listo, quiero enviar esto al servidor. El orden de los eventos es importante, por lo que es necesario preservar el orden de la lista.JSON polimorfismo

Lo que me gustaría hacer es tener una biblioteca JSON (no importa cuál) para unir el JSON a algunos objetos Event en mi código Java, donde Event es una clase abstracta, y tengo 3 clases concretas que todos extienden el evento (digamos EventA, EventB y EventC).

escenario ideal sería algo así como

List<Event> events = jsonlibrary.deserialise(jsonString); 

que puede contener una lista de elementos tales como

[eventA, eventC, eventA, eventA, eventB] 

Es esto posible, o tengo que inspeccionar el árbol JSON de forma manual, y deserialise los elementos individuales de la matriz json?

Respuesta

6

objetos JSON son pares clave/valor justo y no contienen información de tipo. Eso significa que no es posible identificar el tipo de objeto JSON de forma automática. Debe implementar cierta lógica en el lado del servidor para averiguar qué tipo de evento está enfrentando.

Sugiero utilizar un método de fábrica que toma una cadena json, la analiza para descubrir qué tipo de evento es, crea un objeto Evento de la subclase correcta y lo devuelve.

+0

esa era la forma en que iba. Esperaba que hubiera una biblioteca que pudiera hacer un pequeño reflejo para deducir la información tipo, o tal vez pasar una lista de clases de objetos al deserializador, para dar a las clases la opción de elegir entre – Codemwnci

+0

. Voy a seguir con su método por el momento. Como solo tengo un número limitado de clases, puedo deserializar las clases base con una cantidad limitada de recorrido de árbol. – Codemwnci

1

Se puede usar la biblioteca Genson http://code.google.com/p/genson/. Puede deserializar a tipos de concreto si el json se produjo usando Genson. De lo contrario sólo tiene que añadir algo como [{ "@class": "my.java.class", "el resto de las propiedades"} ...]

// an example 
abstract class Event { 
String id; 
} 

class Click extends Event { 
double x, y; 
} 

// you can define aliases instead of plain class name with package (its a bit nicer and more secure) 
Genson genson = new Genson.Builder().setWithClassMetadata(true).addAlias("click", 
      Click.class).create(); 
String json = "[{\"@class\":\"click\", \"id\":\"here\", \"x\":1,\"y\":2}]"; 

// deserialize to an unknown type with a cast warning 
List<Event> events = genson.deserialize(json, List.class); 

// or better define to which generic type 
GenericType<List<Event>> eventListType = new GenericType<List<Event>>() {}; 
events = genson.deserialize(json, eventListType); 

EDITAR Aquí está el wiki ejemplo http://code.google.com/p/genson/wiki/GettingStarted#Interface/Abstract_classes_support

1

Por qué no usar jackson json library?

Es un objeto completo/JSON Mapper con datos Funcionalidad de unión.

Es rápido, de pequeño tamaño, documentado, usado en exceso, y muchas otras cosas que usted podrá disfrutar!

0

I comenzó una biblioteca que implementa el fonctionality deseada (por JSON y XML) si el json está codificada por la misma biblioteca:

https://github.com/giraudsa/serialisation

Para usarlo, MyObject myObject = new SpecialisedObject();

String json = JsonMarshaller.ToJson(myObject); 
MyObject myClonedObject = JsonUnMarshaller(json);