Преобразовать массив JSONS в одну вложенную иерархическую JSON - PullRequest
0 голосов
/ 10 апреля 2020

Итак, я создаю API для Spring, который хранит инопланетян и их семейные отношения. До сих пор я добился создания связи ManyToOne - OneToMany между родителем и потомком, то есть я сохраняю имя и идентификатор родителя, а когда я делаю запрос на получение, я получаю идентификатор, имя и потомки этого идентификатора. Тем не менее, я хочу вывести полностью вложенное представление всех инопланетян в базе данных как единую сущность.

Итак, моя БД выглядит так:

insert into (id, name, planet, type, parent_id) ALIEN values (1,'William','Earth','Alpha', null);
insert into (id, name, planet, type, parent_id) ALIEN values (2,'Henry',  'Earth', 'Alpha',1);
insert into (id, name, planet, type, parent_id) ALIEN values (3,'Matt',  'Mars','Beta', 2);
insert into (id, name, planet, type, parent_id) ALIEN values (4,'Alisa',  'Mars', 'Gamma',2);

И что я получил так далеко:

Контроллер

@GetMapping("/all")
public Stream<AlienDto> getAll() {
    return repo.findAll().stream().map(mapToAlienDto);
}

private Function<Alien, AlienDto> mapToAlienDto = p -> AlienDto.builder()
                                                               .id(p.getId())
                                                               .name(p.getName())
                                                               .planet(p.getPlanet())
                                                               .type(p.getType())
                                                               .children(p.getChildren())
                                                               .build()

                                                               ;

AlienDto

@Data
@Builder
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonNaming(value = PropertyNamingStrategy.SnakeCaseStrategy.class)
@JsonIgnoreProperties({"hibernate_lazy_initializer", "handler"})
public class AlienDto {
    private Long id;
    private String name;
    private String type;
    private String planet;
    private Alien parent;
    private Set<Alien> children;

}

Чужой класс

@Entity
@JsonNaming(value = PropertyNamingStrategy.SnakeCaseStrategy.class)
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonIgnoreProperties({"hibernate_lazy_initializer", "handler"})
@EqualsAndHashCode(onlyExplicitlyIncluded = true)
public class Alien {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Getter
    @Setter
    @EqualsAndHashCode.Include
    private Long id;
    @Getter
    @Setter
    private String name;
    @Getter
    @Setter
    private String type;
    @Getter
    @Setter
    private String planet;
    @ManyToOne(fetch=FetchType.LAZY)
    @Getter
    @Setter
    private Alien parent;
    @OneToMany(mappedBy="parent", fetch=FetchType.LAZY)
    @JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
    @Setter
    private Set<Alien> children;
//  @JsonIgnore
    public Set<Alien> getChildren() {
        return children;
    }

    @JsonIgnore
    public Alien getParent() {
        return parent;
    }

Что я получил

[
    {
        "id": 1,
        "name": "William",
        "type": "Alpha",
        "planet": "Earth",
        "children": [
            {
                "id": 2,
                "name": "Henry",
                "type": "Alpha",
                "planet": "Earth"
            }
        ]
    },
    {
        "id": 2,
        "name": "Henry",
        "type": "Alpha",
        "planet": "Earth",
        "children": [
            {
                "id": 3,
                "name": "Matt",
                "type": "Beta",
                "planet": "Mars"
            },
            {
                "id": 4,
                "name": "Alisa",
                "type": "Gamma",
                "planet": "Mars"
            }
        ]
    },
    {......

Что я хочу:

{
        "id": 1,
        "name": "William",
        "type": "Alpha",
        "planet": "Earth",
        "children": [
            {
                "id": 2,
                "name": "Henry",
                "type": "Alpha",
                "planet": "Earth",
                "children": [
                             id,
                             name,......
                               ]
    }

Спасибо!

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