JavaのFlexjsonを強制的にjsonオブジェクトを文字列にゆるくするように強制する方法は?
質問
だから私はこのように見えるサーバーからオブジェクトを取り戻します:
{
"Status": {
"stuff":"stuff...";
"morestuff":"morestuff...";
};
"Data": { ... another object ... };
}
しかし、このオブジェクトを取り戻したら、このように見えるJavaクラスにそれを脱上したいと思います。
class Response
{
public StatusObject Status;
public String Data;
}
しかし、FlexJSonはオブジェクトをデータ属性と見なし、その後、データ文字列にハッシュマップをキャストしようとします。データ属性として「null」を使用して応答を取得すると、すべてが正常に機能します(文字列にnullを割り当てることができるため)。
FlexJSONに、データ属性からハッシュマップを作成しないように指示し、文字列として(たとえJSONオブジェクトであっても)単にそれを取るようにするにはどうすればよいですか?
今、私のコードの脱派化ラインは次のようになります:
formattedResponse = new JSONDeserializer<network.Response>()
.use( "values", network.Response.class )
.deserialize(JSONString, network.Response.class);
助けてくれてありがとう!
解決
JSONがオブジェクトに結合し始める前にJSONを中間形式に解析するため、それは困難です。そのため、使用する型のオブジェクトの尋問を開始する前に、すでにハッシュマップに解析されています。あなたがそれを文字列に入れたいなら、あなたはそれをJSONに戻します。オブジェクトファクトリーを使用してそれを行うことができ、それをオブジェクトのパスにバインドできます。 ObjectFactoryの内部では、それを文字列に変えて、それをそこのオブジェクトにバインドできます。
new JSONDeserializer<...>()
.use( "values", Response.class )
.use( "values.Data", new JSONStringTransformer() )
.deserialize( json, Response.class );
他のヒント
私は同じ愚かな問題を抱えていましたが、それを解決するために自分の物を書くことの道を進みました。
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);
所属していません StackOverflow