android - 仅使用 Jackson 将父类(super class)字段序列化为 JSON

标签 android json jackson

我正在用 Jackson 序列化一个类的实例。 仅序列化此实例的父类(super class)字段的最佳方法是什么?

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

最佳答案

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

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 写入父类(super class)字段,即使运行时实例是子类类型。

{"accountNumber":"0031-3402-2189","routingNumber":"0009835011203","balance":53500}

编辑:

Thanks, but in my case I try to achieve this behaviour for several classes are fields of the outer class that I serialize. Can I define the types more in general?

这种情况更容易处理。只需用 @JsonSerialize 注释外部类中的适当字段即可。 .如果将字段声明为父类(super class)类型,则将 typing 设置为静态。这会将这些字段标记为 Jackson 以使用编译时类型而不是运行时类型进行序列化。

另一方面,如果您将字段声明为子类类型,则将 using 设置为父类(super class)。

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

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

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

关于android - 仅使用 Jackson 将父类(super class)字段序列化为 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13912647/

相关文章:

android - Java Eclipse android-XML 编辑器(图形显示)不工作

javascript - Node.js 请求 - 无法获取 REST 响应 (JSON) 的属性

java - @JsonCreator 'Could not find creator property with name' 即使 ignoreUnknown = true

java - 使用 mapstruct : Error:(22, 映射 48) java: 参数类型 "quote"没有名为 "quote_type"的属性

android - 将 SDL C++ 应用程序交叉编译到 Android

java - NoClassDefFoundError : com. sforce.soap.enterprise.Connector

android - ID、标签 null 或父 ID 与 com.google.android.gms.maps.MapFragment 的另一个 fragment 重复

php - 如何将 NSString 从 JSON 转换为 NSDictionary?

javascript - 将多维表单数据序列化为 JSON 对象数组以与 application/json 一起使用

java - Jackson 序列化忽略使用非 jackson 注释注释的字段