0

我有一堂课说人。当我使用 gson 将其转换为 json 时,有时我想包含 field name,但有时我不想包含它。我可以将gson中的任何api用于这种目的吗?

class Person {
   int id;
   String name;
}
4

3 回答 3

2

一种方法是使用ExclusionStrategyin Gson。它允许我们定义一个策略来判断GsonBuilder是否使用自定义标准序列化类或字段。

代码片段
我使用一个变量isNameIgnored来启用/禁用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();
于 2019-12-26T04:47:48.683 回答
1

接受的答案是正确的,也是最灵活的方法。

但是,根据具体情况,@Version如果实际上是关于版本化不同案例的问题,有时您可以从注释中受益。所以你可以做的是制作你的类的版本,比如:

@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();

于 2019-12-26T10:34:49.447 回答
0

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

于 2019-12-26T04:09:18.407 回答