# Criando transformações básicas com JOLT

O JOLT pode ser usado para diversos tipos de transformações, desde as mais simples até as mais avançadas. Neste documento, apresentamos as **operações básicas**, que permitem:

* Reestruturar o JSON ou renomear campos.
* Inserir valores padrão quando campos estiverem ausentes.
* Remover campos específicos.
* Organizar campos em ordem alfabética.

{% hint style="success" %}
**Dica:** Teste os exemplos deste documento no [playground do JOLT](https://jolt-demo.appspot.com/#inception).
{% endhint %}

## **Entendendo as operações básicas do JOLT**

Nesta seção, você aprenderá como cada operação básica do JOLT funciona (`shift`, `default`, `remove` e `sort`) e quando utilizá-las.

### **shift**

A operação `shift` reestrutura um objeto JSON ao remapear seus campos, sem modificar seus valores. Ela funciona definindo **de onde extrair os valores** no JSON original e **para onde colocá-los** na nova estrutura.

#### **Exemplo prático**

* **Caso de uso:** Transformar um catálogo de produtos para atender a um novo formato.
* **Objetivo:** Agrupar detalhes do produto dentro de um objeto `details` e renomear campos.

**JSON de entrada**

```json
{
  "product": {
    "id": "12345",
    "name": "Smartphone X1",
    "brand": "TechBrand",
    "price": 699.99,
    "currency": "USD",
    "stock": 25
  }
}
```

**JSON de saída desejado**

```json
{
  "productId": "12345",
  "details": {
    "name": "Smartphone X1",
    "brand": "TechBrand",
    "pricing": {
      "amount": 699.99,
      "currency": "USD"
    },
    "availability": 25
  }
}
```

**Spec de transformação**

```json
[
  {
    "operation": "shift",
    "spec": {
      "product": {
        "id": "productId",
        "name": "details.name",
        "brand": "details.brand",
        "price": "details.pricing.amount",
        "currency": "details.pricing.currency",
        "stock": "details.availability"
      }
    }
  }
]
```

**Explicação**

* `"id": "productId"` move `product.id` para o nível superior com um novo nome.
* `"name"` e `"brand"` são agrupados dentro de `details`.
* `"price"` e `"currency"` são aninhados em `details.pricing` para organizar informações de preço.
* `"stock"` é renomeado para `availability` e agrupado em `details`.

Usando a **notação por ponto** (`.`) e caminhos hierárquicos no spec, você pode organizar estruturas complexas com pouco esforço.

{% hint style="warning" %}
Somente os campos explicitamente mapeados na spec de transformação aparecerão na saída. Qualquer outro dado da entrada será ignorado.
{% endhint %}

### **default**

A operação `default` adiciona campos a um objeto JSON **quando eles não existem**. É útil para preencher dados ausentes com valores pré-definidos.

#### **Exemplo prático**

* **Caso de uso:** Completar dados de cliente com uma data de nascimento padrão.
* **Objetivo:** Garantir que o JSON de saída inclua o campo `birthDate`, mesmo quando ele estiver ausente no input.

**JSON de entrada**

```json
{
 "customer": {
   "name": "Customer Default",
   "ssn": "123-45-6789"
 }
}
```

**JSON de saída desejado**

```json
{
 "customer": {
   "name": "Customer Default",
   "ssn": "123-45-6789",
   "birthDate": "01/01/1970"
 }
}
```

**Spec de transformação**

```json
[    
 {
   "operation": "default",
   "spec": {
     "customer": {
       "birthDate": "01/01/1970"
     }
   }
 }
]
```

**Explicação**

* A operação verifica se `customer.birthDate` existe.
* Se não existir, `"01/01/1970"` é adicionado como valor padrão.
* Se já existir, o valor original é mantido.

Essa operação é útil para garantir que campos essenciais sempre estejam presentes no output, mesmo quando não são fornecidos no input..

{% hint style="warning" %}
A operação `default` **não** sobrescreve valores existentes, ela apenas preenche os ausentes.
{% endhint %}

### **remove**

A operação `remove` **exclui campos ou objetos específicos** de uma estrutura JSON. Para isso, é necessário navegar até o campo desejado e atribuir a ele uma string vazia (`""`) no spec.

#### **Exemplo prático**

* **Caso de uso:** Limpar dados de cliente removendo campos desnecessários.
* **Objetivo:** Remover o campo `birthDate` do objeto customer.

**JSON de entrada**

```json
{
 "customer": {
   "name": "Customer Default",
   "ssn": "123.456.789.10",
   "birthDate": "01/01/1970"
 }
}

```

**JSON de saída desejado**

```json
{
 "customer": {
   "name": "Customer Default",
   "ssn": "123.456.789.10"
 }
}
```

**Spec de transformação**

```json
[
 {
   "operation": "remove",
   "spec": {
     "customer": {
       "birthDate": ""
     }
   }
 }
]
```

**Explicação**

* A transformação navega até `customer.birthDate` e a remove ao atribuir `""`.
* Apenas os campos explicitamente definidos como string vazia serão removidos.
* Qualquer valor diferente de vazio fará a operação falhar.

{% hint style="warning" %}
Certifique-se de usar `""` para indicar que o campo deve ser removido. Isso é necessário para que a operação funcione.
{% endhint %}

### **sort**

A operação `sort` **organiza todos os campos e objetos de um JSON em ordem alfabética**, pelo nome da chave. Ela se aplica globalmente. A ordenação não pode ser personalizada e **somente as chaves são ordenadas**, não os valores.

#### **Exemplo prático**

* **Caso de uso:** Colocar campos de dados de funcionários em ordem alfabética para manter consistência.
* **Objetivo:** Garantir que todos os campos no JSON de saída apareçam em ordem alfabética.

**JSON de entrada**

```json
{
 "employee": {
   "phone": "9 9999-9999",
   "name": "Employee Sort",
   "birthDate": "01/01/1980",
   "role": "JOLT Analyst"
 }
}
```

**JSON de saída desejado**

```json
{
 "employee": {
   "birthDate": "01/01/1980",
   "name": "Employee Sort",
   "phone": "9 9999-9999",
   "role": "JOLT Analyst"
 }
}
```

**Spec de transformação**

```json
[
 {
   "operation": "sort"
 }
]
```

**Explicação**

* A operação `sort` não precisa de `spec`. Basta declarar a operação.
* Todos os campos do JSON são ordenados alfabeticamente pelo nome da chave.
* A ordenação se aplica **recursivamente**, ou seja, também aos objetos internos.

## **Continue aprendendo**

Agora que você já conhece os conceitos essenciais, pode avançar para os próximos tópicos:

* [**Operadores JOLT**](/documentation/resources/pt-br/use-cases/how-to-jolt/operators.md), elementos que deixam suas especificações mais dinâmicas e flexíveis.
* [**Operações avançadas**](/documentation/resources/pt-br/use-cases/how-to-jolt/advanced-operations.md), onde você explora técnicas de transformação mais sofisticadas.
* [**Exemplos de uso**](/documentation/resources/pt-br/use-cases/how-to-jolt/use-cases.md), que demonstram o funcionamento do JOLT em cenários reais de integração.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.digibee.com/documentation/resources/pt-br/use-cases/how-to-jolt/basic-operations.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
