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.java
in test.jackson
package とBar.java
in package があるとします。org.myorg
int
String
これら 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」) をカスタマイズすることもできます。お役に立てれば!