让我们上课:
class A {
int common;
int forGSON1;
int forGSON2;
int forGSON3;
int forGSON12;
}
对于一种情况,我想在序列化期间跳过一些字段,对于不同的情况,我想跳过其他一些;对于每种情况,我想要跳过哪些字段是固定的。例如,在情境#1 中,我要保存common
,forGSON1
和forGSON12
;在情境#2 - common
,forGSON2
和forGSON12
;在情境#3 - common
,forGSON3
。
我不想通过创建然后序列化对象的部分副本来解决这个问题(对我来说这是一个糟糕的解决方案)。我想它可以通过使用不同配置构建的不同Gson
对象来完成。如果我们有两个情境,我们可以使用@Expose
注释并为一种情况构建Gson
对象,同时使用注释(通过.excludeFieldsWithoutExposeAnnotation()
)和其他{{跳过字段1}}使用注释保留字段的对象,我们还可以使用修饰符Gson
(以及更多现有修饰符)作为我们transient
的不同行为的标记(通过Gson
)。但它只适用于少数(2-3)种情况(解决方案比正常解决方案更.excludeFieldsWithModifiers
);很遗憾,我还没有找到像hack
这样的方法。
我该如何解决这个问题?
答案 0 :(得分:1)
这可以使用自定义排除策略来实现。这是代码。
1)创建自定义排除注释
2)创建自定义排除策略类
3)在创建Gson对象时使用排除策略类
排除策略类: -
public class Strategy1 implements ExclusionStrategy {
@Override
public boolean shouldSkipField(FieldAttributes f) {
return f.getAnnotation(Strategy1Exclude.class) != null;
}
@Override
public boolean shouldSkipClass(Class<?> clazz) {
return false;
}
}
public class Strategy2 implements ExclusionStrategy {
@Override
public boolean shouldSkipField(FieldAttributes f) {
return f.getAnnotation(Strategy2Exclude.class) != null;
}
@Override
public boolean shouldSkipClass(Class<?> clazz) {
return false;
}
}
public class Strategy3 implements ExclusionStrategy {
@Override
public boolean shouldSkipField(FieldAttributes f) {
return f.getAnnotation(Strategy3Exclude.class) != null;
}
@Override
public boolean shouldSkipClass(Class<?> clazz) {
return false;
}
}
排除注释: -
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Strategy1Exclude {
}
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Strategy2Exclude {
}
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Strategy3Exclude {
}
A类: -
public class A {
int common;
@Strategy3Exclude
@Strategy2Exclude
int forGSON1;
@Strategy3Exclude
@Strategy1Exclude
int forGSON2;
@Strategy2Exclude
@Strategy1Exclude
int forGSON3;
@Strategy3Exclude
int forGSON12;
...
getters and setters
}
主要方法: -
public static void main(String[] args) {
A a = new A();
a.setCommon(1);
a.setForGSON1(2);
a.setForGSON12(12);
a.setForGSON3(3);
a.setForGSON2(2);
Gson gsonStrategy1 = new GsonBuilder().setExclusionStrategies(new Strategy1()).create();
Gson gsonStrategy2 = new GsonBuilder().setExclusionStrategies(new Strategy2()).create();
Gson gsonStrategy3 = new GsonBuilder().setExclusionStrategies(new Strategy3()).create();
System.out.println(gsonStrategy1.toJson(a));
System.out.println(gsonStrategy2.toJson(a));
System.out.println(gsonStrategy3.toJson(a));
}
<强>输出: - 强>
{"common":1,"forGSON1":2,"forGSON12":12}
{"common":1,"forGSON2":2,"forGSON12":12}
{"common":1,"forGSON3":3}