在将对象序列化为
JSON的以下杰克逊/ Java代码中,我得到以下结果:
{"animal":{"x":"x"}}
但是,我实际想要得到的是:
{"dog":{"x":"x"}}
有什么我可以做的动物容器,以便我得到的对象的运行时类型(“狗”,“猫”),而不是“动物”)? (编辑:我知道地图名称来自getter和setter-方法名称.)我可以想到的唯一方法是在AnimalContainer中具有每种类型的Animal的属性,具有setter和getter所有这些,并强制一次只有一个是重视的.但是,这违背了动物超类的目的,只是似乎错了.在我的真实代码中,我实际上有十几个子类,而不仅仅是“狗”和“猫”.有没有更好的方式来做(可能使用注释不知何故)?我需要一个反序列化解决方案.
public class Test { public static void main(String[] args) throws Exception { AnimalContainer animalContainer = new AnimalContainer(); animalContainer.setAnimal(new Dog()); StringWriter sw = new StringWriter(); // serialize ObjectMapper mapper = new ObjectMapper(); MappingJsonFactory jsonFactory = new MappingJsonFactory(); JsonGenerator jsonGenerator = jsonFactory.createJsonGenerator(sw); mapper.writeValue(jsonGenerator,animalContainer); sw.close(); System.out.println(sw.getBuffer().toString()); } public static class AnimalContainer { private Animal animal; public Animal getAnimal() {return animal;} public void setAnimal(Animal animal) {this.animal = animal;} } public abstract static class Animal { String x = "x"; public String getX() {return x;} } public static class Dog extends Animal {} public static class Cat extends Animal {} }
解决方法
根据
this announement,Jackson 1.5实现了完整的多态类型处理,而trunk现在将该代码集成在一起.
有两个简单的方法来使这项工作:
>在超类型中添加@JsonTypeInfo注释(Animal here),或>通过调用ObjectMapper.enableDefaultTyping()来配置对象映射器(但如果是,则动画需要是抽象类型)
原文地址:https://www.jb51.cc/java/125824.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。