private boolean hasDecimalType(Types.StructType structType) {
    return structType.fields().stream()
        .map(Types.NestedField::type)
        .anyMatch(
            (Predicate<Type>)
                type -> {
                  if (type.typeId() == Type.TypeID.STRUCT) {
                    boolean hasDecimalType = hasDecimalType((Types.StructType) type);
                    if (hasDecimalType) {
                      return true;
                    }
                  }
                  return type.typeId() == Type.TypeID.DECIMAL;
                });
  }
Object mapper for parsing the JSON.
amoro-format-iceberg/src/main/java/org/apache/amoro/log/LogDataJsonDeserialization.java