Как разобрать массив Json generi c с элементами наследования - PullRequest
0 голосов
/ 14 февраля 2020

мой вопрос не тот же этот вопрос . если я хочу объяснить, давайте предположим, что у нас есть эти классы (A, B, C).

@Data
@NoArgsConstructor
class A {
    private Integer x;
    private String type;

    public A(String type, Integer x) {
        this.type = type;
        this.x = x;
    }
}
@Data
class B extends A {
    private Integer y;

    public B(Integer x, Integer y) {
        super("B", x);
        this.y = y;
    }
}
@Data
class C extends A {
    private Integer z;

    public C(Integer x, Integer z) {
        super("C", x);
        this.z = z;
    }
}

знаю, что я хочу проанализировать массив, базовыми классами которого являются A. и со свойством с именем type я хочу преобразовать каждый элемент в его специфицированный c класс. что-то вроде этого кода.

public static void main(String[] args) {
        Gson gson = new Gson();
        List<A> list = new ArrayList<>();
        A a = new A("A", 0);
        list.add(a);
        B b = new B(1, 2);
        list.add(b);
        C c = new C(3, 4);
        list.add(c);
        String serializedJson = gson.toJson(list);
        List<? extends A> deserializedList = gson.fromJson(serializedJson, new TypeToken<List<? extends A>>() {
        }.getType());
        for (A item : deserializedList) {
            System.out.println(item.getType());
            if (item instanceof B) {
                System.out.println(((B) item).getY());

            } else if (item instanceof C) {
                System.out.println(((C) item).getZ());

            }
        }
    }

сериализовано json это что-то вроде

[{"x":0,"type":"A"},{"y":2,"x":1,"type":"B"},{"z":4,"x":3,"type":"C"}]

в реальном мире, у меня есть что-то вроде json и я хочу разобрать его. но когда я запускаю код, свойства y и z не печатаются, и объекты не являются экземплярами B или C. Как достичь этой цели, чтобы разобрать и создать каждый элемент со свойством типа.

Ответы [ 2 ]

0 голосов
/ 15 февраля 2020

Я нашел решение с помощью механизма Gson TypeAdapterFactory. создание класса для реализации com.google.gson.TypeAdapterFactory. для более подробной информации см. ссылка

0 голосов
/ 14 февраля 2020
for(A item : deserializedList) {
  switch(item.getType()) {
    case "B":
      System.out.println(((B) item).getY());
    break;
    case "C":
      System.out.println(((C) item).getZ());
    break;
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...