1

Web サービスから JSON 応答を受信して​​いますが、さまざまな理由から、最終的な応答オブジェクトで特定のプロパティを逆シリアル化したくありません。たとえば、私は持っています:

public class Foo {
    private String bar;
    private int baz;

    //getters & setters
}

返される JSON 応答には両方のプロパティがありますが、逆シリアル化時に「バー」を設定したくありません。この理由は、彼らが送信しているプロパティは長いですが、私たちのものは文字列であるため、デシリアライズすると IllegalArgumentException がスローされます。

別のオプションは、JSON を json-simple のようなもので解析し、必要なプロパティを削除し、それを JSON に戻してデシリアライザーに渡すことですが、JSON はかなり大きいので、可能であればそれを避けたいと思います。

おそらく ObjectFactory でこれを行う方法はありますか?

4

1 に答える 1

2

はい、ObjectFactory を使用して、Long から String への変換を許可できます。次のように、パスに ObjectFactory を登録するだけです。

new JSONDeserializer().use("some.path.to.bar", new EnhancedStringObjectFactory() ).deserialize( json, new SomeObject() );



public class EnhancedStringObjectFactory implements ObjectFactory {
    public Object instantiate(ObjectBinder context, Object value, Type targetType, Class targetClass) {
        if( value instanceof String ) {
            return value;
        } else if( value instanceof Number ) {
            return ((Number)value).toString();
        } else {
           throw context.cannotConvertValueToTargetType(value, String.class);
        }
   }
}

これを String のデフォルトの ObjectFactory として登録することもできます。これにより、デシリアライザーに入る任意の String に対してそのケースを処理できます。

new JSONDeserializer().use( String.class, new EnhancedStringObjectFactory() ).deserialize( json, new SomeObject() );
于 2012-03-07T19:01:09.427 に答える