在这种情况下,我有两个使用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。
答案 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"}