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!

¿Fue útil?

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);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top