DTO de JSON con clave dinámica

Estoy tratando de descubrir cómo escribir un buen DTO para una aplicación Spring Boot que delegue las capacidades de búsqueda a otro servicio (Python).

Así que actualmente tengo una configuración casi perfecta. Solo tengo problemas para representar las agregaciones que recibo de Elasticsearch como objetos en el lado de Java.

Aquí está el actualAggregation 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;
}

Sin embargo, mirando la representación JSON, que se ve así:

{
  "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
    },
....

Estoy bastante seguro de que puedo cambiar elbuckets propiedad así:

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;
}

con una clase de cubo que comienza así

package com.example.dto.search;

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

Pero como puedes ver en el JSON, elsub_categories La clave es el problema, ya que es un nombre dinámico. También será de tipoBucket, ya que los cubos se pueden anidar en Elasticsearch.

Cualquier idea sobre cómo representar estos cubos como objetos personalizados y no solo unMap?

Respuestas a la pregunta(1)

Su respuesta a la pregunta