1

だから私は次のようなサーバーからオブジェクトを取り戻しています:

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

ただし、このオブジェクトを取得したら、次のようなJavaクラスに逆シリアル化します。

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

しかし、FlexJsonはオブジェクトをデータ属性と見なし、HashMapをデータ文字列にキャストしようとします。Data属性として「null」を使用して応答が返される場合、すべてが正常に機能します(文字列にnullを割り当てることができるため)。

FlexJsonにData属性からHashMapを作成せず、(JSONオブジェクトであっても)文字列として取得するように指示するにはどうすればよいですか?

現在、私のコードの逆シリアル化行は次のようになっています。

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

助けてくれてありがとう!

4

2 に答える 2

2

JSONをオブジェクトへのバインドを開始する前に、JSONを中間形式に解析するため、これは困難です。そのため、使用するタイプについてオブジェクトへの問い合わせを開始する前に、すでにHashMapに解析されています。文字列に入れたい場合は、JSONに戻す必要があります。これは、ObjectFactoryを使用して、オブジェクトのパスにバインドすることで実行できます。ObjectFactory内で、それを文字列に変換し、そこでオブジェクトにバインドすることができます。

new JSONDeserializer<...>()
    .use( "values", Response.class )
    .use( "values.Data", new JSONStringTransformer() )
    .deserialize( json, Response.class );
于 2012-02-20T20:46:37.247 に答える
0

私は同じばかげた問題を抱えていましたが、それを解決するために独自のObjectFactoryを作成する道を歩みました。

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

クライアントコードでは、次のようにファクトリを使用する必要があります。

MyDomainClass foo = new JSONDeserializer<MyDomainClass>()
    .use("sillyJSONField", new JSONStringFactory())
    .deserialize(requestJson, MyDomainClass.class);
于 2014-06-20T14:40:26.637 に答える