Saltar a contenido

Operadores personalizados

Fracttal ETL extiende los operadores estándar de JSON Logic con operadores propios disponibles en el bloque transform de cualquier configuración ETL.


Renombrado y cast

rename

Mapea campos de origen a destino, renombrándolos y opcionalmente casteando su tipo.

Firma: ["rename", [logic, "nuevo_nombre", "tipo?"], ...]

Cada elemento del array es una tupla de 2 o 3 elementos: la lógica para obtener el valor, el nombre del campo de salida y el tipo de cast opcional.

{
  "rename": [
    [{"var": "firstName"}, "nombre", "string"],
    [{"var": "age"}, "edad", "integer"],
    [{"var": "price"}, "precio", "number"],
    [{"var": "active"}, "activo", "boolean"],
    [{"var": "tags"}, "etiquetas", "array"]
  ]
}

Ver Tipos de datos para la referencia completa de tipos de cast.


Texto

trim

Elimina caracteres de los extremos de un string.

Firma: ["trim", logic, "caracteres", "mode"]

Parámetro Tipo Por defecto Descripción
logic JSON Logic Expresión para obtener el string
caracteres string Caracteres a eliminar
mode string "all" "all", "left" o "right"
{"trim": [{"var": "name"}, " ", "all"]}
{"trim": [{"var": "code"}, "0", "left"]}

split

Divide un string por un separador y retorna el elemento en el índice indicado.

Firma: ["split", logic, "separador", indice]

{"split": [{"var": "full_name"}, " ", 0]}
{"split": [{"var": "email"}, "@", 1]}

join

Une los elementos de un array en un string usando un separador.

Firma: ["join", logic, "separador"]

{"join": [{"var": "tags"}, ", "]}

substring

Extrae una porción de un string por índice de inicio y fin.

Firma: ["substring", logic, inicio, fin]

Índices con base 0. Si fin es 0, extrae hasta el final.

{"substring": [{"var": "code"}, 0, 4]}
{"substring": [{"var": "description"}, 10, 0]}

case

Convierte un string a mayúsculas o minúsculas.

Firma: ["case", logic, "upper"|"lower"]

{"case": [{"var": "country"}, "upper"]}

replace

Reemplaza todas las ocurrencias de un substring en el string.

Firma: ["replace", logic, "original", "reemplazo"]

{"replace": [{"var": "phone"}, "-", ""]}
{"replace": [{"var": "text"}, " ", "_"]}

switch

Mapea un valor a otro usando pares valor,resultado separados por coma. El último elemento sin par es el valor por defecto.

Firma: ["switch", logic, "v1,r1,v2,r2,...,default"]

{"switch": [{"var": "status"}, "A,Activo,I,Inactivo,P,Pendiente,Desconocido"]}

Con un solo par y sin default:

{"switch": [{"var": "type"}, "premium,true,"]}


replace_if_condition

Reemplaza el valor únicamente si coincide con un valor de comparación; de lo contrario, retorna el valor original.

Firma: ["replace_if_condition", logic, "valor_comparar", "valor_reemplazo"]

{"replace_if_condition": [{"var": "status"}, "None", "Pendiente"]}
{"replace_if_condition": [{"var": "category"}, "null", "Sin categoría"]}

string_to_array

Divide un string en un array usando el separador indicado.

Firma: ["string_to_array", logic, "separador"]

{"string_to_array": [{"var": "tags"}, ","]}

startsWith

Retorna true si el string comienza con el prefijo dado.

Firma: ["startsWith", logic, "prefijo"]

{"startsWith": [{"var": "code"}, "FTL-"]}

endsWith

Retorna true si el string termina con el sufijo dado.

Firma: ["endsWith", logic, "sufijo"]

{"endsWith": [{"var": "filename"}, ".pdf"]}

Números

round

Redondea un número al número de decimales indicado. Sin decimales redondea al entero más cercano.

Firma: ["round", logic, decimales?]

{"round": [{"var": "price"}, 2]}
{"round": [{"var": "total"}, 0]}

format_number

Formatea un número usando plantillas de formato Python ({:,}, {:.2f}, etc.).

Firma: ["format_number", logic, "formato_entero", "formato_decimal?"]

{"format_number": [{"var": "amount"}, "{:,}"]}

Con decimales:

{"format_number": [{"var": "amount"}, "{:,}", "{:.2f}"]}


Fechas

format_date

Convierte fechas entre formatos, aplica zonas horarias o genera la fecha/hora actual.

Firma: ["format_date", logic_o_"now", "formato_entrada", "formato_salida", "timezone?"]

Formato de salida especial Descripción
"timestamp" Unix timestamp como string
"microsoft_json_date" Formato /Date(milisegundos)/

Conversión de formato:

{"format_date": [{"var": "created_at"}, "%Y-%m-%d", "%d/%m/%Y"]}

Con zona horaria:

{"format_date": [{"var": "date"}, "%Y-%m-%dT%H:%M:%S", "%d/%m/%Y %H:%M", "America/Santiago"]}

Fecha y hora actual:

{"format_date": ["now", "", "%Y-%m-%dT%H:%M:%S", "Europe/Madrid"]}

A timestamp:

{"format_date": [{"var": "date"}, "%Y-%m-%d", "timestamp"]}


add_timedelta

Suma un intervalo de tiempo a una fecha en formato ISO 8601 (%Y-%m-%dT%H:%M:%S.%f%z).

Firma: ["add_timedelta", "fecha_iso", numero, "tipo"]

tipo Descripción
"hour" (defecto) Horas
"day" Días (equivale a 24 horas)
"second" Segundos
{"add_timedelta": ["2024-01-15T00:00:00.000+0000", 24, "hour"]}
{"add_timedelta": ["2024-01-15T00:00:00.000+0000", 7, "day"]}

substract_timedelta

Resta un intervalo de tiempo a una fecha en formato ISO 8601.

Firma: ["substract_timedelta", "fecha_iso", numero, "tipo"]

{"substract_timedelta": ["2024-01-15T00:00:00.000+0000", 1, "day"]}

substract_datetime

Calcula la diferencia entre dos fechas y la retorna en segundos.

Firma: ["substract_datetime", logic, "fecha_referencia_o_now", "formato"]

Usando "now" como referencia (fecha actual en UTC):

{"substract_datetime": [{"var": "start_date"}, "now", "%Y-%m-%dT%H:%M:%S%z"]}

Entre dos fechas concretas:

{"substract_datetime": [{"var": "end_date"}, "2024-01-01T00:00:00+0000", "%Y-%m-%dT%H:%M:%S%z"]}


Booleanos

set_boolean

Convierte un valor a true/false/null comparándolo con valores de referencia.

Firma: ["set_boolean", logic, "valor_true", "valor_false?"]

Caso Comportamiento
Sin valor_false true si coincide con valor_true, false en cualquier otro caso
Con valor_false true, false o null si no coincide con ninguno
{"set_boolean": [{"var": "status"}, "active"]}

Con valor false explícito:

{"set_boolean": [{"var": "flag"}, "SI", "NO"]}


Arrays

in

Retorna true si un valor está contenido en el resultado de la lógica.

Firma: ["in", "valor", logic]

{"in": ["admin", {"var": "roles"}]}

flatmap

Aplana un array de objetos añadiendo campos del contexto padre a cada elemento.

Firma: ["flatmap", logic_array, context_fields?]

context_fields es una lista de especificaciones de campos del objeto padre a inyectar en cada item:

{
  "flatmap": [
    {"var": "items"},
    [
      {"field": {"var": "order_id"}, "as": "order_id"},
      {"field": {"var": "customer_name"}, "as": "customer"}
    ]
  ]
}

Sin campos de contexto (solo aplana el array):

{"flatmap": [{"var": "lines"}]}


Ejemplo completo

Transformación de un pedido: renombrado, formato de fecha, cálculo de diferencia y cast de tipo.

{
  "merge": [
    {
      "rename": [
        [{"var": "orderId"}, "id_pedido", "string"],
        [{"var": "totalAmount"}, "total", "number"],
        [{"var": "customerName"}, "cliente", "string"]
      ]
    },
    {
      "fecha_creacion": {
        "format_date": [{"var": "createdAt"}, "%Y-%m-%dT%H:%M:%S", "%d/%m/%Y", "America/Bogota"]
      }
    },
    {
      "estado": {
        "switch": [{"var": "status"}, "pending,Pendiente,confirmed,Confirmado,cancelled,Cancelado,Desconocido"]
      }
    },
    {
      "nombre_cliente": {
        "trim": [{"var": "customerName"}, " ", "all"]
      }
    }
  ]
}

Referencias