Сериализация JSON подкласса в суперкласс - PullRequest
0 голосов
/ 16 мая 2018

У меня есть два класса:

Суперкласс:

public class A
{
    public int a;

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

Подкласс:

public class B extends A
{
    public B(int a)
    {
        super(a);
    }
}

Я использую Джексона для сериализации / десериализации экземпляров A & B.

Я бы хотел, чтобы класс B был сериализован в A .Я ожидал бы, что это будет прямо, поскольку у B нет никаких участников.Но я получил исключение от Джексона, и единственное решение, которое я нашел, объявляет B подтипом A - и я не хочу использовать это решение, потому что этот способ B сериализуется и десериализуется в B.

Мое ограничение заключается в том, что я не могу создавать другие классы, содержащие A / B (контейнер).

1 Ответ

0 голосов
/ 16 мая 2018

Если у вас есть класс контейнера , Джексон должен десериализоваться до типа в классе контейнера.Я переименовал A в Animal и B в Bird.

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);
    }
  }
}

При сериализации объекта-контейнера с помощью Bird, а затем десериализации его, он становится Animal.

@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.readerFor.

@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());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...