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