在选定的执行中跳过父类中的gson字段

时间:2018-03-15 09:45:14

标签: java json serialization gson

在这种情况下,我有两个使用GSON实现的类,一个是A,另一个是B,

Class A {

    @SerializedName("x")
    @Expose
    private String x;
    @SerializedName("y")
    @Expose
    private String y;
 ...
} 

class B extends A{

    @SerializedName("x")
    @Expose
    private List<String> x;
    @SerializedName("z")
    @Expose
    private String z;
...
}

问题是这两个类都需要在那里有序列化名称x字段,并且不能对A类进行任何更改,因为它被其他类使用,所以当B类序列化时,由于多个变量而给出了错误一个序列化名称。什么是最佳解决方案? GSON排除策略不会按照我的理解工作,因为它将永远跳过父x。

1 个答案:

答案 0 :(得分:0)

序列化ExclusionStrategy时需要B,但序列化A时则不需要。所以只需制作2个Gson个对象。

<强> ExclusionStrategy

使用时会忽略A.x

class MyExclusionStrategy implements ExclusionStrategy {

  public boolean shouldSkipClass(Class<?> clazz) {
    return false;
  }

  public boolean shouldSkipField(FieldAttributes field) {
    return field.getDeclaringClass().equals(A.class) && 
           field.getName().equals("x");
  }
}

鉴于这两个对象:

A a = new A();
a.setX("xValue");
a.setY("yValue");

B b = new B();
b.setX(Arrays.asList("a", "b"));
b.setY("yValue");
b.setZ("zValue");

序列化a

Gson gson = new GsonBuilder().create();
String aAsJsonString = gson.toJson(a);
System.out.println(aAsJsonString);

输出:

{"x":"xValue","y":"yValue"}

序列化b

Gson gson = new GsonBuilder()
    .setExclusionStrategies(new MyExclusionStrategy())
    .create();
String bAsJsonString = gson.toJson(b);
System.out.println(bAsJsonString);

输出:

{"x":["a","b"],"z":"zValue","y":"yValue"}