我有一个如下所示的类(class)
class Person {
Long id;
String firstName;
int age;
}
我的输入看起来像这样:
{ "id": null, "firstName": "John", "age": 10 }
或像这样:
{ "id": 123 }
第一个变体代表一个"new"(非持久化)人,第二个变体通过其数据库 id 指代一个人。
如果
id
是非空的,我想在反序列化期间从数据库加载对象,否则回退到常规解析并将其反序列化为新对象。我试过的:我目前有一个
JsonDeserializer
对于数据库反序列化,但据我了解,没有办法“退回”常规解析。根据this answer我应该使用 TypeAdapterFactory
和 getDelegateAdapter
.我对这种方法的问题是我得到了 JsonReader
(而不是例如 JsonElement
)所以我无法确定输入是否包含有效的 id
不消耗输入。关于如何解决这个问题的任何建议?
最佳答案
我不知道我是否正确理解了您的问题,但如果您已经有 JsonDeserializer
,你应该有一个像这样的方法:
public Person deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) { ... }
在这个方法中,你有对象
context
类型 JsonDeserializationContext
,它允许您在指定对象上调用默认反序列化。因此,您可以在自定义反序列化器中执行类似操作:
//If id is null...
Person person = context.deserialize(json, Person.class);
见
JsonDeserializationContext
documentation .
关于deserialization - Gson:如果存在某些字段,则自定义反序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18585340/