Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 子类到超类的JSON序列化_Java_Json_Jackson_Json Deserialization_Json Serialization - Fatal编程技术网

Java 子类到超类的JSON序列化

Java 子类到超类的JSON序列化,java,json,jackson,json-deserialization,json-serialization,Java,Json,Jackson,Json Deserialization,Json Serialization,我有两门课: 超类: public class A { public int a; public A(int a) { this.a = a; } } 子类: public class B extends A { public B(int a) { super(a); } } 我使用Jackson对A&B的实例进行序列化/反序列化 我希望将类B序列化为A。我希望这是直截了当的,因为B没有任何成员。 但我

我有两门课:

超类:

public class A
{
    public int a;

    public A(int a)
    {
        this.a = a;
    }
}
子类:

public class B extends A
{
    public B(int a)
    {
        super(a);
    }
}
我使用Jackson对A&B的实例进行序列化/反序列化

我希望将类B序列化为A。我希望这是直截了当的,因为B没有任何成员。 但我从Jackson那里得到了一个例外,我找到的唯一解决方案是将B声明为a的子类型——我不想使用这个解决方案,因为这样B被序列化并反序列化为B


我的限制是无法创建另一个类来包含A/B(容器)。

如果您有一个容器类,Jackson应该反序列化到容器类中的类型。我把A改名为动物,B改名为鸟

public class Container {
  public Animal animal;

  public Container() {}

  public static class Animal {
    public Animal() {}
    public Animal(int age) {
      this.age = age;
    }
    public int age;
  }

  public static class Bird extends Animal {
    public Bird() {}
    public Bird(int age) {
      super(age);
    }
  }
}
当用鸟序列化容器对象,然后反序列化它时,它将变成动物

@Test
public void fromBirdToAnimal() throws IOException {
  Container one = new Container();
  one.animal = new Container.Bird(123);
  String json = new ObjectMapper().writeValueAsString(one);

  Container two = new ObjectMapper()
    .readerFor(Container.class).readValue(json);
  assertEquals(123, two.animal.age);
  assertEquals(Container.Animal.class, two.animal.getClass());
}
如果容器类不可能,但您知道所需的类(继承树的根类),告诉
ObjectMapper.Reader for
可以帮助您解决问题

@Test
public void fromBirdToAnimal() throws IOException {
  Container.Bird one = new Container.Bird(123);
  String json = new ObjectMapper().writeValueAsString(one);

  Container.Animal two = new ObjectMapper().readerFor(Container.Animal.class).readValue(json);
  assertEquals(123, two.age);
  assertEquals(Container.Animal.class, two.getClass());
}

非常感谢你的回答!虽然这是我没有想到的一个很好的解决方案,但我不能在代码中使用容器类。你认为有没有其他的解决方案可以在不创建新类的情况下使用Jackson lib的能力?我已经对答案进行了一些编辑。这对你有用吗?谢谢你的帮助!我面临的情况是,有一个超级类的子类型。我有很多这样的子类,比如A。所以当使用ObjectMapper时,我不能显式地将其设置为读取A