Question

Je reçois un retour d'objet à partir d'un serveur qui ressemble à ceci:

{
    "Status": {
        "stuff":"stuff...";
        "morestuff":"morestuff...";
        };
    "Data": { ... another object ... };
}

Cependant, quand je reçois ce retour d'objet, je veux désérialiser à une classe java qui ressemble à ceci:

class Response
{
    public StatusObject Status;
    public String Data;
}

Mais FlexJson voit un objet comme l'attribut de données et tente ensuite de jeter un HashMap à ma chaîne de données. Si je reçois un retour de réponse avec « null » comme l'attribut de données, tout fonctionne très bien (puisque vous pouvez affecter null à une chaîne).

Comment puis-je dire à propos FlexJson de ne pas essayer de faire une HashMap de l'attribut de données et il suffit de prendre comme une chaîne (même si elle est un objet JSON)?

En ce moment, ma ligne de désérialisation de regards de code comme ceci:

formattedResponse = new JSONDeserializer<network.Response>()
                    .use( "values", network.Response.class )
                    .deserialize(JSONString, network.Response.class);

Merci pour toute aide!

Était-ce utile?

La solution

C'est difficile, car il analyse le JSON en une forme intermédiaire avant qu'elle ne commence la liaison dans l'objet. Donc, il est déjà analysé dans un HashMap avant qu'il ne commence à interroger l'objet de ce type, il doit utiliser. Si vous voulez le mettre dans une chaîne que vous aurez rallumez en JSON. Vous pouvez le faire en utilisant un ObjectFactory et de liaison qui sur le chemin de votre objet. A l'intérieur du ObjectFactory alors il pourrait le transformer en la chaîne, puis liez dans l'objet il.

new JSONDeserializer<...>()
    .use( "values", Response.class )
    .use( "values.Data", new JSONStringTransformer() )
    .deserialize( json, Response.class );

Autres conseils

J'ai eu le même problème stupide, mais je suis allé sur la route d'écrire mon propre ObjectFactory pour le résoudre.

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);
    }
}

Dans le code client vous suffit d'utiliser l'usine comme ça:

MyDomainClass foo = new JSONDeserializer<MyDomainClass>()
    .use("sillyJSONField", new JSONStringFactory())
    .deserialize(requestJson, MyDomainClass.class);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top