在这种情况下,我有两个具有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。
序列化B
时需要使用ExclusionStrategy
,但在序列化A
时不需要。所以只需制作 2 个Gson
对象。
排除策略
这将在使用时忽略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");
}
}
给定以下 2 个对象:
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"}