仅使用Jackson将超类字段序列化为JSON



我正在用Jackson序列化一个类的实例。只序列化此实例的超类的字段的最佳方式是什么?

目前,我必须将JSONIgnore注释添加到子类中的每个方法中,有更好的方法吗?

假设您可以直接通过ObjectMapper控制序列化过程,那么您可以通过创建一个特定于超类的ObjectWriter来轻松实现这一点。下面是一些示例代码。

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;
}

最新更新