如何enable/disable在Gson中动态序列化一个字段

How to enable/disable one field serialization dynamically in Gson

我有一个 class 说人。我在用gson转成json的时候,有时候想把name这个字段也包含进去,但有时候又不想包含。我可以将 gson 中的 api 用于此类目的吗?

class Person {
   int id;
   String name;
}

api of gson,我们可以使用方法'toJson(java.lang.Object src, java.lang.Appendable writer)'来指定src的泛型类型。 那么,我们可以对 enable/disable 字段使用不同的类型吗?

一种方法是在 Gson 中使用 ExclusionStrategy。它允许我们定义一个策略来告诉 GsonBuilder 是否序列化 类 或具有自定义条件的字段。

代码片段
我使用变量 isNameIgnored 到 enable/disable 字段 name 进行动态序列化。

boolean isNameIgnored = false;
ExclusionStrategy strategy = new ExclusionStrategy() {
    @Override
    public boolean shouldSkipClass(Class<?> clazz) {
        return false;
    }

    @Override
    public boolean shouldSkipField(FieldAttributes field) {
        return isNameIgnored ? "name".equals(field.getName()) : false;
    }
};

然后可以将策略应用到GsonBuilder进行序列化,如下:

Gson gson = new GsonBuilder()
        .addSerializationExclusionStrategy(strategy)
        .create();

是正确的,也是最灵活的方法。

然而,根据具体情况,有时您可以使用注释 @Version 如果它实际上是关于不同情况版本控制的问题。所以你可以做的是制作你的 class 的版本,比如:

@Getter @Setter
public class User {
    @Since(1.0)
    private int id;
    @Since(1.1)
    private String name;
}

然后使用GsonBuilder来决定要处理的版本,例如:

Gson gson10 = getGsonBuilder().setVersion(1.0).create();
Gson gson11 = getGsonBuilder().setVersion(1.1).create();

还有