如何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();
还有
我有一个 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();
还有