5

Jackson では、アノテーション@JsonTypeInfoを使用してポリモーフィズムのサポートを含めています。

注釈ベースのアプローチを使用したくない場合は、グローバルなデフォルトの型付けを使用するか、型情報処理モジュールをオーバーライドできます。

グローバル型情報を試しましたが、最終型以外のすべての型情報を出力しています。

私が必要なもの、

  1. ポリモーフィック型のみ型情報を含めたい。
  2. 型情報のデフォルトフォーマットを変更したい(キーと値のペアに)

グローバル設定をいじるだけで、上記の2点を達成することは可能ですか?

そうでない場合、型情報モジュールをカスタマイズするためにどの拡張ポイントを使用すればよいですか? JacksonAnnotationIntrospectorは型情報を扱うクラスです

上記の2点を達成するためにカスタマイズする必要がありますか?

例のヘルプはうまくいきます。

4

2 に答える 2

11

DefaultTypeResolverBuilderこの目的には、Jackson's を使用できます。このクラスを拡張し、useForTypeメソッドを適切にオーバーライドします。test.jacksonパッケージ (およびサブパッケージ)に属するクラスの型情報のみを追加する例を次に示します。

import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.ObjectMapper.DefaultTypeResolverBuilder;
import com.fasterxml.jackson.databind.ObjectMapper.DefaultTyping;

public class CustomTypeResolverBuilder extends DefaultTypeResolverBuilder
{
    public CustomTypeResolverBuilder()
    {
        super(DefaultTyping.NON_FINAL);
    }

    @Override
    public boolean useForType(JavaType t)
    {
        if (t.getRawClass().getName().startsWith("test.jackson")) {
            return true;
        }

        return false;
    }
}

ここで、「integer」という変数と「string」という変数をそれぞれ含むFoo.javain test.jacksonpackage とBar.javain package があるとします。org.myorgintString

これら 2 つのクラスのオブジェクトは、次の方法でシリアル化できます。

ObjectMapper objectMapper = new ObjectMapper();

TypeResolverBuilder<?> typeResolver = new CustomTypeResolverBuilder();
typeResolver.init(JsonTypeInfo.Id.CLASS, null);
typeResolver.inclusion(JsonTypeInfo.As.PROPERTY);
typeResolver.typeProperty("@CLASS");
objectMapper.setDefaultTyping(typeResolver);

Foo foo = new Foo(10, "Foo");
Bar bar = new Bar(20, "Bar");

System.out.println(objectMapper.writeValueAsString(foo));
System.out.println(objectMapper.writeValueAsString(bar));

対応する出力は次のようになります。

{"@CLASS":"test.jackson.Foo","integer":10,"string":"Foo"}
{"integer":20,"string":"Bar"}

タイプを表す属性の名前 (上記の例では「@CLASS」) をカスタマイズすることもできます。お役に立てれば!

于 2013-07-29T18:56:54.557 に答える