DTO do JSON com chave dinâmica

Estou tentando descobrir como escrever um bom DTO para um aplicativo Spring Boot que esteja proxy dos recursos de pesquisa para outro serviço (Python).

Portanto, atualmente tenho uma configuração quase perfeita. Só estou tendo problemas para representar as agregações que recebo do Elasticsearch como objetos no lado Java.

Aqui está o atualAggregation DTO:

package com.example.dto.search;

import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

import java.util.List;
import java.util.Map;

@Getter @Setter @NoArgsConstructor
public class Aggregation {
    private List<Map<String, Object>> buckets;
    private int docCountErrorUpperBound;
    private int sumOtherDocCount;
}

Olhando para a representação JSON, porém, que se parece com isso:

{
  "aggregations": {
    "categories": {
      "buckets": [
        {
          "doc_count": 12,
          "key": "IT",
          "sub_categories": {
            "buckets": [
              {
                "doc_count": 12,
                "key": "Programming"
              }
            ],
            "doc_count_error_upper_bound": 0,
            "sum_other_doc_count": 0
          }
        },
        {
          "doc_count": 1,
          "key": "Handy Man",
          "sub_categories": {
            "buckets": [
              {
                "doc_count": 1,
                "key": "Plumbing"
              }
            ],
            "doc_count_error_upper_bound": 0,
            "sum_other_doc_count": 0
          }
        }
      ],
      "docCountErrorUpperBound": 0,
      "sumOtherDocCount": 0
    },
....

Tenho certeza de que posso mudar obuckets propriedade assim:

package com.example.dto.search;

import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

import java.util.List;
import java.util.Map;

@Getter @Setter @NoArgsConstructor
public class Aggregation {
    private List<Bucket> buckets;
    private int docCountErrorUpperBound;
    private int sumOtherDocCount;
}

com uma classe de balde começando assim

package com.example.dto.search;

public class Bucket {
    private int docCount;
    private String key;
    //What do I do here for sub_categories???
}

Mas como você pode ver no JSON, osub_categories A chave é o problema, pois é um nome dinâmico. Também será do tipoBucket, uma vez que os buckets podem ser aninhados no Elasticsearch.

Alguma idéia de como representar esses buckets como objetos personalizados e não apenas umMap?

questionAnswers(1)

yourAnswerToTheQuestion