好吧,评分最高的答案是相当快的,当你缺乏太多时间时,本质上并不是很糟糕,但问题是:没有适当的关注点分离
您正在编写业务逻辑的同一位置修改序列化的 JSON。您应该在 a 或 中执行所有序列化。TypeAdapter
JsonSerializer
我们如何保持适当的关注点分离?
答案围绕着一些额外的复杂性,但架构需要它。我们开始(取自我的另一个答案):
首先,我们将对类型使用自定义序列化程序。其次,我们必须在基类和包装子类中创建一个复制构造函数,如下所示:
注意:自定义序列化程序可能看起来有些矫枉过正,但相信我,从长远来看,它在可维护性方面是有回报的。.
// Lets say the base class is named Cat
public class Cat {
public String name;
public Cat(String name) {
super();
this.name = name;
}
// COPY CONSTRUCTOR
public Cat(Cat cat) {
this.name = cat.name;
}
@Override
public String sound() {
return name + " : \"meaow\"";
};
}
// The wrapper subclass for serialization
public class CatWrapper extends Cat{
public CatWrapper(String name) {
super(name);
}
public CatWrapper(Cat cat) {
super(cat);
}
}
以及该类型的序列化程序:Cat
public class CatSerializer implements JsonSerializer<Cat> {
@Override
public JsonElement serialize(Cat src, Type typeOfSrc, JsonSerializationContext context) {
// Essentially the same as the type Cat
JsonElement catWrapped = context.serialize(new CatWrapper(src));
// Here, we can customize the generated JSON from the wrapper as we want.
// We can add a field, remove a field, etc.
// The main logic from the top rated answer now here instead of *spilling* around(Kindly ignore the cat having a url for the sake of example)
return catWrapped.getAsJsonObject().addProperty("url_to_user", url);
}
}
那么,为什么要使用复制构造函数呢?
好吧,一旦你定义了复制构造函数,无论基类发生多大的变化,你的包装器都会继续使用相同的角色。其次,如果我们不定义一个复制构造函数,而只是子类,那么我们将不得不在扩展类方面“讨论”,即.您的组件很可能根据基类而不是包装器类型进行讨论。CatWrapper