Gson:跳过不同gsons的不同领域

时间:2016-10-21 06:10:35

标签: java gson

问题

让我们上课:

class A {
   int common;
   int forGSON1;
   int forGSON2;
   int forGSON3;
   int forGSON12;
}

对于一种情况,我想在序列化期间跳过一些字段,对于不同的情况,我想跳过其他一些;对于每种情况,我想要跳过哪些字段是固定的。例如,在情境#1 中,我要保存commonforGSON1forGSON12;在情境#2 - commonforGSON2forGSON12;在情境#3 - commonforGSON3

我尝试了什么

我不想通过创建然后序列化对象的部分副本来解决这个问题(对我来说这是一个糟糕的解决方案)。我想它可以通过使用不同配置构建的不同Gson对象来完成。如果我们有两个情境,我们可以使用@Expose注释并为一种情况构建Gson对象,同时使用注释(通过.excludeFieldsWithoutExposeAnnotation())和其他{{跳过字段1}}使用注释保留字段的对象,我们还可以使用修饰符Gson(以及更多现有修饰符)作为我们transient的不同行为的标记(通过Gson)。但它只适用于少数(2-3)种情况(解决方案比正常解决方案更.excludeFieldsWithModifiers);很遗憾,我还没有找到像hack这样的方法。

我该如何解决这个问题?

1 个答案:

答案 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}