java - Gson:使用不同的gson跳过不同的字段

标签 java gson

问题

让我们上课吧:

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

对于一种情况,我想在序列化过程中跳过一些字段,对于不同的情况,我想跳过其他一些字段;我想跳过的字段对于每种情况都是固定的。例如,在情况#1中,我想保存commonforGSON1forGSON12;在情况#2中 - commonforGSON2forGSON12;在情况#3 - 常见forGSON3

我尝试了什么

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

如何解决这个问题?

最佳答案

这可以使用自定义排除策略来实现。这是代码。

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}

关于java - Gson:使用不同的gson跳过不同的字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40169518/

相关文章:

java - 对象作为文字的父级

Java Rest 服务打印带有换行符的列表

java - MyBatis : query java. util.Date 与 MYSQL 数据库上的 DATE 类型

java - 在jsp中设置Gson的日期格式

java - 可自动关闭,Groovy 中的文件资源

java - Jenkins:有没有可以远程查看测试报告的API?

android - Kotlin 中的 Gson toJson 和 ArrayList

java - 如何在此示例中使用 GSON 解码 JSON?

java - 使用java将gson转换为对象

android - 如何将文档快照(复杂对象)保存到共享首选项或文件?