java – 使用Jackson ObjectMapper将子类名称序列化为JSON,而不是超类

前端之家收集整理的这篇文章主要介绍了java – 使用Jackson ObjectMapper将子类名称序列化为JSON,而不是超类前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在将对象序列化为 JSON的以下杰克逊/ Java代码中,我得到以下结果:
  1. {"animal":{"x":"x"}}

但是,我实际想要得到的是:

  1. {"dog":{"x":"x"}}

有什么我可以做的动物容器,以便我得到的对象的运行时类型(“狗”,“猫”),而不是“动物”)? (编辑:我知道地图名称来自getter和setter-方法名称.)我可以想到的唯一方法是在AnimalContainer中具有每种类型的Animal的属性,具有setter和getter所有这些,并强制一次只有一个是重视的.但是,这违背了动物超类的目的,只是似乎错了.在我的真实代码中,我实际上有十几个子类,而不仅仅是“狗”和“猫”.有没有更好的方式来做(可能使用注释不知何故)?我需要一个反序列化解决方案.

  1. public class Test
  2. {
  3. public static void main(String[] args) throws Exception
  4. {
  5. AnimalContainer animalContainer = new AnimalContainer();
  6. animalContainer.setAnimal(new Dog());
  7.  
  8. StringWriter sw = new StringWriter(); // serialize
  9. ObjectMapper mapper = new ObjectMapper();
  10. MappingJsonFactory jsonFactory = new MappingJsonFactory();
  11. JsonGenerator jsonGenerator = jsonFactory.createJsonGenerator(sw);
  12. mapper.writeValue(jsonGenerator,animalContainer);
  13. sw.close();
  14. System.out.println(sw.getBuffer().toString());
  15. }
  16. public static class AnimalContainer
  17. {
  18. private Animal animal;
  19. public Animal getAnimal() {return animal;}
  20. public void setAnimal(Animal animal) {this.animal = animal;}
  21. }
  22. public abstract static class Animal
  23. {
  24. String x = "x";
  25. public String getX() {return x;}
  26. }
  27. public static class Dog extends Animal {}
  28. public static class Cat extends Animal {}
  29. }

解决方法

根据 this announement,Jackson 1.5实现了完整的多态类型处理,而trunk现在将该代码集成在一起.

有两个简单的方法来使这项工作:

>在超类型中添加@JsonTypeInfo注释(Animal here),或>通过调用ObjectMapper.enableDefaultTyping()来配置对象映射器(但如果是,则动画需要是抽象类型)

猜你在找的Java相关文章