¿Cómo forzar a Flexjson en Java a deserializar un objeto JSON a una cadena?
Pregunta
Así que estoy recuperando un objeto de un servidor que se ve así:
{
"Status": {
"stuff":"stuff...";
"morestuff":"morestuff...";
};
"Data": { ... another object ... };
}
Sin embargo, cuando recupere este objeto, quiero deserializarlo a una clase de Java que se vea así:
class Response
{
public StatusObject Status;
public String Data;
}
Pero Flexjson ve un objeto como el atributo de datos y luego trata de lanzar un hashmap a mi cadena de datos. Si recibo una respuesta con 'NULL' como atributo de datos, todo funciona bien (ya que puede asignar nulo a una cadena).
¿Cómo puedo decirle a Flexjson que no intente hacer un hashmap con el atributo de datos y simplemente tomarlo como una cadena (incluso si es un objeto JSON)?
En este momento mi línea de código de deserialización se ve así:
formattedResponse = new JSONDeserializer<network.Response>()
.use( "values", network.Response.class )
.deserialize(JSONString, network.Response.class);
¡Gracias por cualquier ayuda!
Solución
Eso es difícil porque analiza el JSON en una forma intermedia antes de comenzar a unirlo al objeto. Por lo tanto, ya está analizado en un hashmap antes de que comience a interrogar el objeto para qué tipos debe usar. Si querías ponerlo en una cuerda, lo volverás a convertir en JSON. Puede hacerlo utilizando una Factory de Object y vincularlo en la ruta en su objeto. Dentro de ObjectFactory podría convertir eso en la cadena y vincularlo en el objeto allí.
new JSONDeserializer<...>()
.use( "values", Response.class )
.use( "values.Data", new JSONStringTransformer() )
.deserialize( json, Response.class );
Otros consejos
Tuve el mismo problema tonto, pero siguió el camino de escribir mi propia Factory de objetos para resolverlo.
package mypackage
import flexjson.JSONSerializer;
import flexjson.ObjectBinder;
import flexjson.ObjectFactory;
import java.lang.reflect.Type;
public class JSONStringFactory implements ObjectFactory {
@Override
public Object instantiate(ObjectBinder objectBinder, Object o, Type type, Class aClass) {
return new JSONSerializer().deepSerialize(o);
}
}
En el código del cliente solo tiene que usar la fábrica como esa:
MyDomainClass foo = new JSONDeserializer<MyDomainClass>()
.use("sillyJSONField", new JSONStringFactory())
.deserialize(requestJson, MyDomainClass.class);