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!

È stato utile?

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);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top