[英]Gson add field during serialization
我找不到在Gson中序列化期间添加自定义字段的简单方法,我希望其他人可以提供帮助。
这是一个展示我的问题的示例类:
public class A {
String id;
String name;
...
}
当我序列化类时,AI想要返回类似的东西:
{ "id":"123", "name":"John Doe", "url_to_user":"http://www.example.com/123" }
其中url_to_user未存储在我的A类实例中,但可以使用A类实例中的数据生成。
有一个简单的方法吗? 我宁愿避免编写整个序列化程序只是为了添加一个字段。
使用Gson.toJsonTree
获取JsonElement
,您可以使用它动态交互。
A a = getYourAInstanceHere();
Gson gson = new Gson();
JsonElement jsonElement = gson.toJsonTree(a);
jsonElement.getAsJsonObject().addProperty("url_to_user", url);
return gson.toJson(jsonElement);
好吧,评价最高的答案非常快,当你缺少很多时间时并不是很糟糕但问题是:没有适当的关注分离
您正在编写业务逻辑的同一位置修改序列化JSON。 您应该在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
进行“交谈”。 您的组件很可能会根据基类而不是包装类型进行讨论。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.