Как написать сплющенный список десериализатора с помощью Джексона? - PullRequest
0 голосов
/ 03 февраля 2019

Я пытаюсь десериализовать JSON определенной структуры в классы Java с Джексоном.У меня есть несколько классов, подобных этим:

class A {
  private int number1;
  private List<X> list1;
  private int number2;
}

class X {
  private String field1;
  private double value1;
}


class B {
  private String name2;
  private List<Y> list2;
}

class Y {
  private String field2;
}

И я получаю JSON из внешней системы, как показано ниже:

{
  "number1": 1,
  "list1": {
    "elements": [{
      "field1": "Field 1 value 1",
      "value1": 2.2
    }, {
      "field1": "Field 1 value 2"
    }]
  },
  "number2": 2,
}


{
  "name2": "Name 2",
  "list2": {
    "elements": [{
      "field2": "Field 2 value 1"
    }]
  }
}

Все, что я хочу, - это написать собственный десериализатор, от которого можно избавитьсяэто elements level в общем виде (я имею в виду наличие одного десериализатора для всех классов).Есть ли какой-нибудь простой способ расширить StdDeserializer для достижения этой цели или я должен написать совершенно новый десериализатор с моим собственным алгоритмом?

1 Ответ

0 голосов
/ 05 февраля 2019

Вы можете взглянуть на этот вопрос: Джексон - десериализовать внутренний список объектов в список более высокого уровня , который очень похож.Я реализовал там специальный десериализатор, который можно использовать для разных типов с внутренним списком.Ваш пример POJO может выглядеть следующим образом:

class A {
    private int number1;

    @JsonDeserialize(using = InnerListDeserializer.class)
    private List<X> list1;
    private int number2;

    // getters, setters
}

РЕДАКТИРОВАТЬ
Если вы не хотите использовать какие-либо аннотации или пользовательскую десериализацию, вам нужно создать структуру POJO, котораяподходит дано JSON.Вам нужно создать середину POJO:

class ListWrapper<T> {

    private List<T> elements;

    // getter, setter, toString, etc
}

Теперь вам нужно обновить классы A и B следующим образом:

class A {
    private int number1;
    private ListWrapper<X> list1;
    private int number2;

    // getters, setters, toString
}

и

class B {

    private String name2;
    private ListWrapper<Y> list2;

    // getters, setters, toString
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...