Come forzare Flexjson in Java a deserializzare un oggetto JSON a una stringa?
Domanda
Quindi sto ottenendo un oggetto indietro da un server che assomiglia a questo:
{
"Status": {
"stuff":"stuff...";
"morestuff":"morestuff...";
};
"Data": { ... another object ... };
}
Tuttavia, quando riprendo questo oggetto, voglio deserializzarlo in una classe Java che assomiglia a questa:
class Response
{
public StatusObject Status;
public String Data;
}
Ma Flexjson vede un oggetto come attributo di dati e quindi cerca di lanciare un hashmap alla mia stringa di dati. Se ricevo una risposta con 'Null' come attributo dati, tutto funziona bene (dal momento che puoi assegnare null a una stringa).
Come faccio a dire a Flexjson di non provare a realizzare un hashmap dall'attributo dei dati e prenderlo come una stringa (anche se è un oggetto JSON)?
In questo momento la mia linea di codice di deserializzazione sembra così:
formattedResponse = new JSONDeserializer<network.Response>()
.use( "values", network.Response.class )
.deserialize(JSONString, network.Response.class);
Grazie per tutto l'aiuto!
Soluzione
È difficile perché analizza il JSON in una forma intermedia prima che inizi a legarlo all'oggetto. Quindi è già analizzato in un hashmap prima che inizi a interrogare l'oggetto per quali tipi dovrebbe usare. Se volevi metterlo in una corda, lo avrai di nuovo in JSON. Puoi farlo usando un oggetto e lessicalo sul percorso nel tuo oggetto. All'interno di ObjectFactory potrebbe quindi trasformarlo nella stringa e legarlo nell'oggetto lì.
new JSONDeserializer<...>()
.use( "values", Response.class )
.use( "values.Data", new JSONStringTransformer() )
.deserialize( json, Response.class );
Altri suggerimenti
Ho avuto lo stesso problema sciocco, ma sono andato lungo la strada di scrivere il mio Factory Object per risolverlo.
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);
}
}
Nel codice client devi solo usare la fabbrica del genere:
MyDomainClass foo = new JSONDeserializer<MyDomainClass>()
.use("sillyJSONField", new JSONStringFactory())
.deserialize(requestJson, MyDomainClass.class);