私はJacksonでクラスのインスタンスをシリアル化しています。このインスタンスのスーパークラスのフィールドのみをシリアル化するための最良の方法は何ですか?
現在、サブクラスのすべてのメソッドにJSONIgnoreアノテーションを追加する必要がありますが、それを行うためのより良い方法はありますか?
を介してシリアル化プロセスを直接制御できると仮定すると、スーパークラスに固有のObjectWriterObjectMapper
を作成することで、これを簡単に実行できます。これを説明するサンプルコードを次に示します。
public class Account implements Serializable {
private String accountNumber;
private String routingNumber;
private BigDecimal balance;
// Constructors, setters/getters
}
public class SavingsAccount extends Account {
private BigDecimal savingsRate;
// Constructors, setters/getters
}
final ObjectMapper mapper = new ObjectMapper();
final ObjectWriter writer = mapper.writerWithType(Account.class);
final ByteArrayOutputStream baos = new ByteArrayOutputStream(6400);
final SavingsAccount account = new SavingsAccount("0031-3402-2189",
"0009835011203", BigDecimal.valueOf(53500),
BigDecimal.valueOf(0.3));
writer.writeValue(baos, account);
final String results = new String(baos.toByteArray());
baos.close();
System.out.println(results);
上記のコードを実行すると、ランタイムインスタンスがサブクラスタイプであっても、Jacksonがスーパークラスフィールドを書き込むことがわかります。
{"accountNumber":"0031-3402-2189","routingNumber":"0009835011203","balance":53500}
編集:
感謝しますが、私の場合、シリアル化する外部クラスのフィールドであるいくつかのクラスでこの動作を実現しようとしています。より一般的にタイプを定義できますか?
このシナリオはさらに簡単に処理できます。外部クラスの適切なフィールドに@JsonSerializeでアノテーションを付けるだけです。フィールドをスーパークラスタイプとして宣言する場合は、typing
を静的として設定します。これにより、これらのフィールドに、ランタイムタイプではなくコンパイル時タイプを使用してシリアル化されるJacksonのフラグが立てられます。
一方、フィールドをサブクラスタイプとして宣言する場合はusing
、をスーパークラスとして設定します。
次の例では、上記で定義したクラスを使用しています。
public class BankCustomer implements Serializable {
@JsonSerialize(typing=Typing.STATIC)
private Account cdAccount;
@JsonSerialize(using=Account.class)
private SavingsAccount savingsAccount;
}