Java - Нормализовать и сериализовать вложенную древовидную структуру с помощью Jackon - PullRequest
1 голос
/ 02 августа 2020

Итак, у меня есть двунаправленный график, который выглядит примерно так:

class Node {
    private String name
    private Node[] next;
    private Node[] previous;
    // ...
}

Когда я сериализую его с помощью Джексона и следующей аннотации: JsonIdentityInfo он работает нормально, и я получаю что-то примерно так:

{
  "@id": 1,
  "name": "node1",
  "next": [
    {
       "@id": 2,
       "name": "node2",
       "next": [
         {
            "@id": 3,
            "name": "node3",
            "next": [],
            "previous": [2]
         }   
       ],
       "previous": [1]
    }
  ],
  "previous": []
}

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

Это хорошо, но мне было интересно, можно ли вместо этого получить что-то вроде следующего:

{
    "nodes": [
        {
            "@id": 1,
            "name": "node1",
            "next": [2],
            "previous": []
        },
        {
            "@id": 2,
            "name": "node2",
            "next": [3],
            "previous": [1]
        },
        {
            "@id": 3,
            "name": "node3",
            "next": [],
            "previous": [2]
        }
    ]
}

Где вложение полностью удалено и каждый раз используется идентификатор узла.

Возможно ли добиться этого легко / быстро с Джексоном? при этом мне не нужно определять полный настраиваемый сериализатор / десериализатор

1 Ответ

0 голосов
/ 03 августа 2020

Сначала вам нужно будет добавить аннотацию Джексона:

class Node {
    private String name
    @JsonIdentityReference(alwaysAsId = true)
    private Node[] next;
    @JsonIdentityReference(alwaysAsId = true)
    private Node[] previous;
    // ...
}

Затем загрузите / запросите все ваши узлы в виде списка и сериализуйте их с помощью Jackson, вы получите нужную структуру.

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