杰克逊根据上下文以不同的方式反序列化对象

时间:2015-07-07 09:08:01

标签: java json jackson

在我的应用程序中,想象一下我可以创建一个动物对象:

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:
    }
}

1 个答案:

答案 0 :(得分:1)

您可以在类定义上方使用@JsonIgnoreProperties(ignoreUnknown = true)注释。这样,只会填充Animal对象的id字段,您不必使用自定义反序列化器。