加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-14 16:19:46 所属栏目:Java 来源:网络整理
导读:在将对象序列化为 JSON的以下杰克逊/ Java代码中,我得到以下结果: {"animal":{"x":"x"}} 但是,我实际想要得到的是: {"dog":{"x":"x"}} 有什么我可以做的动物容器,以便我得到的对象的运行时类型(“狗”,“猫”),而不是“动物”)? (编辑:我知道地图名称来
在将对象序列化为 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()来配置对象映射器(但如果是,则动画需要是抽象类型)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读