JavaのFlexjsonを強制的にjsonオブジェクトを文字列にゆるくするように強制する方法は?

StackOverflow https://stackoverflow.com/questions/9353447

  •  27-10-2019
  •  | 
  •  

質問

だから私はこのように見えるサーバーからオブジェクトを取り戻します:

{
    "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);
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top