gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 09:20:54 26 4
gpt4 key购买 nike

问题

让我们上课吧:

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com