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

时间:2012-12-17 10:48:25

标签: android json jackson

我正在与杰克逊序列化一个班级的实例。 仅序列化此实例的超类字段的最佳方法是什么?

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

1 个答案:

答案 0 :(得分:3)

假设您可以通过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}

编辑:

  

谢谢,但在我的情况下,我尝试为几个实现这种行为   classes是我序列化的外部类的字段。我能定义吗?   一般的类型更多?

这种情况更容易处理。只需使用@JsonSerialize注释外部类中的相应字段。如果将字段声明为超类类型,则将typing设置为静态。这将使用编译时类型而不是运行时类型将那些字段标记为Jackson以进行序列化。

另一方面,如果将字段声明为子类类型,则将using设置为超类。

以下示例使用我在上面进一步定义的类:

public class BankCustomer implements Serializable {
    @JsonSerialize(typing=Typing.STATIC)
    private Account cdAccount;

    @JsonSerialize(using=Account.class)
    private SavingsAccount savingsAccount;
}