deserialization - Gson:如果存在某些字段,则自定义反序列化

标签 deserialization gson jsonreader

我有一个如下所示的类(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/

相关文章:

java - Gson:如何跳过特定字段

javascript - 分机号 : Override JsonReader or post-process

Android JsonReader 无法迭代 json 数组

javascript - 将 JSON 字符串反序列化为列表数组

java - 我怎样才能将这个反序列化代码从java翻译成scala?

c# - 从数据库反序列化二进制数组 C#

java - 在GSON中动态设置JSON key

c# - 反序列化为通用排序列表 C#

java - 使用 Gson 反序列化元组数组

json - android JSON 阅读器-IllegalStateException;预期名称但为字符串