在我的应用程序中,想象一下我可以创建一个动物对象:
public class Animal {
private int id;
private String food;
private String comment;
// Getter and setters
}
从app中的somwhere我们创建了很多Animal对象,并将它们存储到数据库中。 动物也可以从JSON创建,所以如果我收到
{
"id":123456,
"food":"biscuit",
"comment":"black with white pows"
}
将在数据库中创建一个新动物。
现在想象我们想把动物放进动物园。
public class Zoo {
List<Animal> animals = new Arraylist<>();
// Getters and Setters
}
动物园可以由Json建造。但是在这里我们不希望收到每个Animal的完整Json,而只是它们的Id,因为它们已经存在于数据库中。 我们会收到类似的内容:
{
"animals": [
{
"id":123456
},
{
"id":987654
}
]
}
所以我们有两种情况,在第一种情况下,Animal是Json的根元素,我们收到所有字段并将其存储到数据库中。 在第二种情况下,Animal可以是一个列表,也可以只是另一个对象的子节点,在反序列化过程中我们只收到从数据库加载它的Id。
所以我的问题是,如何从自定义反序列化器,我可以验证我尝试反序列化的json是根动物还是小动物?
我想写类似的东西:
public class ReferenceDeserializer extends JsonDeserializer<Animal> {
@Override
public Animal deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {
ObjectCodec oc = jp.getCodec();
JsonNode node = oc.readTree(jp);
if (I have a root Animal)
{
deserialize the full animal
} else if (I have a List or a Animal which is not a root object)
{
load the Animal from database with the id received
}
return myAnimal:
}
}
答案 0 :(得分:1)
您可以在类定义上方使用@JsonIgnoreProperties(ignoreUnknown = true)
注释。这样,只会填充Animal
对象的id字段,您不必使用自定义反序列化器。