# Flattening: Transformação de dados utilizando JSONata

### Objetivo <a href="#objetivo" id="objetivo"></a>

Alguns serviços SaaS permitem a criação de campos personalizados. No caso em questão, trata-se de campos de informação criados para acompanhar chamados de atendimento - também conhecidos como tickets. Normalmente, esses campos possuem campos de título ou descrição, porém, geralmente as APIs desses serviços utilizam identificadores numéricos para referenciá-los.

Exemplo: Um ticket no Zendesk com campos personalizados contém uma propriedade chamada **custom\_fields** contendo uma lista de ids e seus valores.

```json
"custom_fields": [
  {
    "id": 360032901812,
    "value": "0457000"
  },
  {
    "id": 360032943991,
    "value": "Depto Suporte"
  },
  {
    "id": 360030824791,
    "value": "XDY667"
  }
]

```

Cada **custom filed** possui seu nome, mas a comunicação por API utiliza apenas o ID para referenciar os campos. Para trabalharmos com dados analíticos vamos "traduzir" os ID para os seus nomes verdadeiros utilizando a tabela abaixo, que foi construída apenas para esse propósito:

```json
 "map": {
  "360032901812": "CEP",
  "360032943991": "Contato Assistência",
  "360030824791": "Cupom"
}
```

O objetivo é transformar a informação original do Zendesk em um objeto contendo os nomes das propriedades, como no exemplo abaixo:

```json
 "resp": {
  "CEP": "0457000",
  "Contato Assistência": "Depto Suporte",
  "Cupom": "XDY667"
}
```

### **Registro de Tickets Completo** <a href="#registro-de-tickets-completo" id="registro-de-tickets-completo"></a>

Segue abaixo a listagem do conteúdo JSON original que utilizaremos. Observe que existem dois **tickets** em uma lista na propriedade **tickets** e o mapeamento está na propriedade **map**.

```json
{
 "tickets": [
   {
     "url": "https://soft.zendesk.com/api/v2/tickets/612022.json",
     "id": 612022,
     "external_id": null,
     "created_at": "2023-10-18T08:12:42Z",
     "updated_at": "2023-10-18T08:212:42Z",
     "subject": "Importação não funcional",
     "description": "Cliente reclama que a importação trava com o seu arquivo",
     "custom_fields": [
       {
         "id": 360032901812,
         "value": "0457000"
       },
       {
         "id": 360032943991,
         "value": "Depto Suporte"
       },
       {
         "id": 360030824791,
         "value": "XDY667"
       }
     ],
     "satisfaction_rating": null,
     "sharing_agreement_ids": [],
     "custom_status_id": 1900000838127
   },
   {
     "url": "https://soft.zendesk.com/api/v2/tickets/612011.json",
     "id": 612011,
     "external_id": null,
     "created_at": "2023-10-18T03:26:42Z",
     "updated_at": "2023-10-18T03:26:42Z",
     "subject": "Problema de acesso ao site. Cliente novo",
     "description": "Cliente reclama que o browser não dá acesso ao site",
     "custom_fields": [
       {
         "id": 360032901812,
         "value": "0381000"
       },
       {
         "id": 360032943991,
         "value": "Parceiro"
       },
       {
         "id": 360030824791,
         "value": "WQK890"
       }
     ],
     "satisfaction_rating": null,
     "sharing_agreement_ids": [],
     "custom_status_id": 1900000838249
   }
 ],
 "map": {
   "360032901812": "CEP",
   "360032943991": "Contato Assistência",
   "360030824791": "Cupom"
 }
}

```

E no final da transformação desejamos chegar ao seguinte resultado:

```json
{
 "tickets": [
   {
     "url": "https://soft.zendesk.com/api/v2/tickets/612022.json",
     "id": 612022,
     "external_id": null,
     "created_at": "2023-10-18T08:12:42Z",
     "updated_at": "2023-10-18T08:212:42Z",
     "subject": "Importação não funcional",
     "description": "Cliente reclama que a importação trava com o seu arquivo",
     "satisfaction_rating": null,
     "custom_status_id": 1900000838127,
     "CEP": "0457000",
     "Contato Assistência": "Depto Suporte",
     "Cupom": "XDY667"
   },
   {
     "url": "https://soft.zendesk.com/api/v2/tickets/612011.json",
     "id": 612011,
     "external_id": null,
     "created_at": "2023-10-18T03:26:42Z",
     "updated_at": "2023-10-18T03:26:42Z",
     "subject": "Problema de acesso ao site. Cliente novo",
     "description": "Cliente reclama que o browser não dá acesso ao site",
     "satisfaction_rating": null,
     "custom_status_id": 1900000838249,
     "CEP": "0381000",
     "Contato Assistência": "Parceiro",
     "Cupom": "WQK890"
   }
 ]
}

```

#### Solução <a href="#light_bulb_on-solucao" id="light_bulb_on-solucao"></a>

Para solucionar a situação, siga os seguintes passos:

<mark style="color:blue;">**Passo 1: Criar uma função que permita encontrar um nome de custom field baseado-se apenas no seu ID.**</mark>&#x20;

Ou seja, ao fornecer um ID, como por exemplo `360035700992`, a função busca e identifica o nome correspondente dentro de uma lista de mapeamento.

Para isso usamos a função **$lookup** do JSONata, como por exemplo:

<table><thead><tr><th>Input</th><th>JSONata</th><th>Output</th><th data-hidden>JSONata</th></tr></thead><tbody><tr><td><pre class="language-json"><code class="lang-json">{
 "map": {
    "360032901812": "CEP",
    "360032943991": "Contato Assistência",
    "360030824791": "Cupom"
  }
}

</code></pre></td><td><pre><code>$lookup(map, "360032901812") </code></pre></td><td>"CEP"</td><td></td></tr></tbody></table>

Observe que a função **$lookup** recebe como parâmetros uma lista e uma string que contém o nome da propriedade a ser buscada na lista. A função retorna o valor da propriedade encontrada.

***

\ <mark style="color:blue;">**Passo 2: Mapear cada entrada de um custom field em uma propriedade cujo valor é o mesmo valor do custom field.**</mark>

Para isso, vamos utilizar a função [**$map**](https://docs.jsonata.org/higher-order-functions#map) do JSONata. Essa função recebe uma lista e permite a definição de uma outra função que será executada para cada um dos elementos da lista. É equivalente a um laço FOR que executará a função para cada um dos elementos da lista.

Conseguimos executar essa operação através do código abaixo:

<table><thead><tr><th>Input</th><th>JSONata</th><th>Output</th></tr></thead><tbody><tr><td><pre class="language-json"><code class="lang-json">{  
  "custom_fields": [
    {
      "id": 360032901812,
      "value": "0457000"
    },
    {
      "id": 360032943991,
      "value": "Depto Suporte"
    },
    {
      "id": 360030824791,
      "value": "XDY667"
    }
  ],
  "map": {
    "360032901812": "CEP",
    "360032943991": "Contato Assistência",
    "360030824791": "Cupom"
  }
}

</code></pre></td><td><pre class="language-json"><code class="lang-json">$map(custom\_fields, function($v, $i, $a) {

```
    {$lookup(map,$string($v.id)) : $v.value}

})
```

</code></pre></td><td><pre class="language-json"><code class="lang-json">\[
{
"CEP": "0457000"
},
{
"Contato Assistência": "Depto Suporte"
},
{
"Cupom": "XDY667"
}
] </code></pre></td></tr></tbody></table>

Observe que a função **$map** recebeu a lista **custom\_fields** como parâmetro. Além disso, especificamos uma função através da chamada **function($v, $i, $a){}**. As variáveis especificadas nesta chamada recebem respectivamente os seguintes valores:

* **$v** : elemento do array que está sendo processado
* **$i** : indice do elemento no array
* **$a** : o array inteiro

Utilizamos as variáveis acima dentro da função para referenciar o que precisamos processar.

Essa função retorna um objeto para cada elemento da lista que é processado. O conteúdo desse objeto é dado por:

```json
                 {$lookup(map,$string($v.id)) : $v.value}
```

Observe que o nome da propriedade na resposta é exatamente o resultado da função de **$lookup** quando buscamos no objeto **map** pela propriedade cujo nome é o valor da propriedade **id** do elemento sendo processado (**$**[**v.id**](http://v.id/)). E o valor da resposta é exatamente o valor da propriedade **value** do mesmo elemento.

Na primeira interação desse **$map** teremos:

<table data-header-hidden><thead><tr><th>1</th><th>2</th></tr></thead><tbody><tr><td>$v</td><td><pre class="language-json"><code class="lang-json">{
  "id": 360032901812,
  "value": "0457000"
},
</code></pre></td></tr><tr><td>$i</td><td>0</td></tr><tr><td>$a</td><td><pre class="language-json"><code class="lang-json">[
  {
    "id": 360032901812,
    "value": "0457000"
  },
  {
    "id": 360032943991,
    "value": "Depto Suporte"
  },
  {
    "id": 360030824791,
    "value": "XDY667"
  }
]

</code></pre></td></tr></tbody></table>

\
Portanto o objeto retornado é:

<pre><code><strong>                            {"CEP" : "0457000"}
</strong></code></pre>

***

<mark style="color:blue;">**Passo 3: Juntar objetos de uma lista em um único objeto**</mark>

Observe que a resposta do **$map** no passo anterior retorna uma lista onde cada objeto é uma propriedade diferente. Precisamos agora juntar esses objetos de uma lista em um único objeto. Para isso, vamos utilizar a função **$merge**.&#x20;

No nosso exemplo, basta passar o resultado da operação anterior como parâmetro da função **$merge**. Essa função concatena todas as propriedades de todos objetos na lista em um único objeto.

<table><thead><tr><th>Input</th><th>JSONata</th><th>Output</th></tr></thead><tbody><tr><td><pre class="language-json"><code class="lang-json">{  
  "custom_fields": [
    {
      "id": 360032901812,
      "value": "0457000"
    },
    {
      "id": 360032943991,
      "value": "Depto Suporte"
    },
    {
      "id": 360030824791,
      "value": "XDY667"
    }
  ],
  "map": {
    "360032901812": "CEP",
    "360032943991": "Contato Assistência",
    "360030824791": "Cupom"
  }
}

</code></pre></td><td><pre class="language-json"><code class="lang-json">$merge($map(custom\_fields, function($v, $i, $a) {

```
    {$lookup(map,$string($v.id)) : $v.value}

}))
```

</code></pre></td><td><pre class="language-json"><code class="lang-json">{
"CEP": "0457000",
"Contato Assistência": "Depto Suporte",
"Cupom": "XDY667"
}

</code></pre></td></tr></tbody></table>

***

<mark style="color:blue;">**Passo 4: Função $flat**</mark>

Sabemos que essa função do passo 03 deverá ser executada para cada um dos tickets e, portanto, teremos que invocá-la muitas vezes. Por essa razão, criamos uma função que acomoda esse código e espera apenas a propriedade **custom\_fields** do ticket para ser executada.

<table><thead><tr><th>Input</th><th>JSONata</th><th>Output</th></tr></thead><tbody><tr><td><pre class="language-json"><code class="lang-json">{ 
 "custom_fields": [
   {
     "id": 360032901812,
     "value": "0457000"
   },
   {
     "id": 360032943991,
     "value": "Depto Suporte"
   },
   {
     "id": 360030824791,
     "value": "XDY667"
   }
 ],
 "map": {
   "360032901812": "CEP",
   "360032943991": "Contato Assistência",
   "360030824791": "Cupom"
 }
}

</code></pre></td><td><pre class="language-json"><code class="lang-json">   $flat := function($fld) {

$merge($map($fld, function($v, $i, $a) {

```
   {$lookup(map,$string($v.id)) : $v.value}
```

}))};

/\* Exemplo de chamada da função \*/

{"resp" : $flat(custom\_fields)};

) </code></pre></td><td><pre class="language-json"><code class="lang-json">{
"resp": {
"CEP": "0457000",
"Contato Assistência": "Depto Suporte",
"Cupom": "XDY667"
}
} </code></pre></td></tr></tbody></table>

Observe que criamos a função **$flat** definida como:

```json
                       $flat := function($fld) { };
```

O código da função está definido dentro das chaves sendo exatamente igual à função definida no passo anterior. A única diferença é que parametrizamos a lista de **custom\_fields** na forma da variável **$fld**.&#x20;

Outra mudança observada é que precisamos envolver o código com  parênteses que englobam todas as especificações funcionais. Isso nos permite definir variáveis e funções que terminam com ponto e vírgula (;).

Dentro desse bloco programático precisamos invocar a função para que o JSONata efetivamente execute o código. É exatamente isso que fazemos com a seguinte linha:

```
                      {"resp" : $flat(custom_fields)};
```

Chamamos a função passando a lista definida em **custom\_field** na variável **$fld**. Com isso recebemos o objeto que desejávamos.

Finalmente nota-se que utilizamos linhas de comentários para documentar o código. Essas linhas possuem delimitadores no formato **/\* texto \*/**.

***

<mark style="color:blue;">**Passo 5: Consolidando os campos mapeados no objeto de ticket original com a função $merge**</mark>

Já geramos no passo 4 um objeto contendo os campos do **custom\_fields** já mapeados. Precisamos agora inserir todas as propriedades desse novo objeto no objeto do ticket original. A melhor forma de fazer isso é utilizando a função **$merge**. Essa função recebe um array de objetos e consolida todas as propriedades dos objetos individuais em um único objeto.

Entretanto, precisamos construir um array que contenha dois objetos, um com as propriedades originais do ticket e outro com as novas propriedades. Conseguimos fazer isso com a seguinte linha de código:

```json
               $append(ticket, $flat(ticket.custom_fields))
```

A função **$append** neste caso anexa dois objetos à uma lista, sendo que primeiro objeto é o **tickets** e o segundo objeto é o resultado da nossa operação **$flat** que também retorna um objeto. Nesse caso a função **$append** retorna uma lista contendo os dois objetos mencionados.

Nos falta apenas executar a função **$merge** sobre a lista gerada. O JSONata nos permite uma sintaxe alternativa na qual indicamos uma função que recebe como argumento o resultado do código previamente especificado. Segue o exemplo abaixo:

```json
          $append(ticket, $flat(ticket.custom_fields)) ~> merge()
```

No exemplo acima, a função **$merge** recebe o resultado da função **$append** como parâmetro de execução. Segue abaixo o exemplo completo para este passo:

<table><thead><tr><th>Input</th><th>JSONata</th><th>Output</th></tr></thead><tbody><tr><td><pre class="language-json" data-title="index.js" data-overflow="wrap" data-line-numbers><code class="lang-json">{
 "tickets": [
   {
     "description": "Cliente reclama que a importação trava com o seu arquivo",
     "custom_fields": [
       {
         "id": 360032901812,
         "value": "0457000"
       },
       {
         "id": 360032943991,
         "value": "Depto Suporte"
       },
       {
         "id": 360030824791,
         "value": "XDY667"
       }
     ]
   }
 ],
 "map": {
   "360032901812": "CEP",
   "360032943991": "Contato Assistência",
   "360030824791": "Cupom"
 }
}

</code></pre></td><td><pre class="language-json"><code class="lang-json">(

/\* Função que mapeia os customs\_fields e devolve um objeto com as propriedades \*/

$flat := function($fld)

```
   {$merge($map($fld, function($v, $i, $a) {

       {$lookup(map,$string($v.id)) : $v.value}

   }))};
```

{

```
   /* código de teste */

   "register":$append(tickets[0], $flat(tickets[0].custom_fields)) ~> $merge()
```

}

) </code></pre></td><td><pre class="language-json"><code class="lang-json">{
"register": {
"description": "Cliente reclama que a importação trava com o seu arquivo",
"custom\_fields": \[
{
"id": 360032901812,
"value": "0457000"
},
{
"id": 360032943991,
"value": "Depto Suporte"
},
{
"id": 360030824791,
"value": "XDY667"
}
],
"CEP": "0457000",
"Contato Assistência": "Depto Suporte",
"Cupom": "XDY667"
}
} </code></pre></td></tr></tbody></table>

Observe que a resposta contém todas as propriedades originais do ticket, mais as propriedades geradas no mapeamento. Mais adiante apresentaremos uma forma de remover o campo **custom\_fields** que tornou-se desnecessário depois do mapeamento.      &#x20;

***

<mark style="color:blue;">**Passo 6: Processamento de múltiplos tickets usando $map e a função $all**</mark>\
Até o passo 5 consideramos a manipulação de um único ticket, porém recebemos múltiplos tickets em um único array e precisamos processar cada um dos tickets individualmente. Esse é exatamente o propósito da função **$map** que será utilizada mais uma vez para processar cada um dos tickets individualmente.

Faremos isso criando uma nova função chamada **$all** cujo objetivo é processar todos os tickets, como definido abaixo:

```json
            $all := $map(tickets, function($r, $s, $t) {

            $append($r, $flat($r.custom_fields)) ~> $merge()

             }) ;
```

Basicamente essa função executa o passo 5 para cada um dos tickets recebidos no array **tickets**.

Existe apenas um problema na abordagem acima que se manifesta apenas quando recebemos um array vazio de tickets. Na forma como está acima, o resultado seria apenas um objeto vazio. Para garantir que essa execução **sempre** retorne um array, mesmo que vazio, executamos um **$append** vazio na sequência da função. Esse **$append** é inócuo quando a operação resultar um array de tickets, mas será útil quando a função retornar vazio, pois transformará o objeto vazio em um array vazio.

```json
             $all := $map(tickets, function($r, $s, $t) {
             $append($r, $flat($r.custom_fields)) ~> $merge()

             }) ~> $append([]);
```

&#x20;Com isso, nosso código fica:

<table><thead><tr><th>Input</th><th width="211">JSONata</th><th>Output</th></tr></thead><tbody><tr><td><pre class="language-json"><code class="lang-json">{
 "tickets": [
   {
     "url": "https://soft.zendesk.com/api/v2/tickets/612022.json",
     "id": 612022,
     "external_id": null,
     "created_at": "2023-10-18T08:12:42Z",
     "updated_at": "2023-10-18T08:212:42Z",
     "subject": "Importação não funcional",
     "description": "Cliente reclama que a importação trava com o seu arquivo",
     "custom_fields": [
       {
         "id": 360032901812,
         "value": "0457000"
       },
       {
         "id": 360032943991,
         "value": "Depto Suporte"
       },
       {
         "id": 360030824791,
         "value": "XDY667"
       }
     ],
     "satisfaction_rating": null,
     "sharing_agreement_ids": [],
     "custom_status_id": 1900000838127
   },
   {
     "url": "https://soft.zendesk.com/api/v2/tickets/612011.json",
     "id": 612011,
     "external_id": null,
     "created_at": "2023-10-18T03:26:42Z",
     "updated_at": "2023-10-18T03:26:42Z",
     "subject": "Problema de acesso ao site. Cliente novo",
     "description": "Cliente reclama que o browser não dá acesso ao site",
     "custom_fields": [
       {
         "id": 360032901812,
         "value": "0381000"
       },
       {
         "id": 360032943991,
         "value": "Parceiro"
       },
       {
         "id": 360030824791,
         "value": "WQK890"
       }
     ],
     "satisfaction_rating": null,
     "sharing_agreement_ids": [],
     "custom_status_id": 1900000838249
   }
 ],
 "map": {
   "360032901812": "CEP",
   "360032943991": "Contato Assistência",
   "360030824791": "Cupom"
 }
}

</code></pre></td><td><pre class="language-json"><code class="lang-json">(

/\* Função que mapeia os customs\_fields e devolve um objeto com as propriedades \*/

$flat := function($fld)

```
   {$merge($map($fld, function($v, $i, $a) {

       {$lookup(map,$string($v.id)) : $v.value}

   }))};
```

/\* Função que executa o mapeamento para cada um dos tickets \*/

$all := $map(tickets, function($r, $s, $t) {

```
   $append($r, $flat($r.custom_fields)) ~> $merge()
```

}) \~> $append(\[]);

{

```
   /* executa função */

   "registers":$all
```

}

) </code></pre></td><td><pre class="language-json"><code class="lang-json">{
"registers": \[
{
"url": "<https://soft.zendesk.com/api/v2/tickets/612022.json>",
"id": 612022,
"external\_id": null,
"created\_at": "2023-10-18T08:12:42Z",
"updated\_at": "2023-10-18T08:212:42Z",
"subject": "Importação não funcional",
"description": "Cliente reclama que a importação trava com o seu arquivo",
"custom\_fields": \[
{
"id": 360032901812,
"value": "0457000"
},
{
"id": 360032943991,
"value": "Depto Suporte"
},
{
"id": 360030824791,
"value": "XDY667"
}
],
"satisfaction\_rating": null,
"sharing\_agreement\_ids": \[],
"custom\_status\_id": 1900000838127,
"CEP": "0457000",
"Contato Assistência": "Depto Suporte",
"Cupom": "XDY667"
},
{
"url": "<https://soft.zendesk.com/api/v2/tickets/612011.json>",
"id": 612011,
"external\_id": null,
"created\_at": "2023-10-18T03:26:42Z",
"updated\_at": "2023-10-18T03:26:42Z",
"subject": "Problema de acesso ao site. Cliente novo",
"description": "Cliente reclama que o browser não dá acesso ao site",
"custom\_fields": \[
{
"id": 360032901812,
"value": "0381000"
},
{
"id": 360032943991,
"value": "Parceiro"
},
{
"id": 360030824791,
"value": "WQK890"
}
],
"satisfaction\_rating": null,
"sharing\_agreement\_ids": \[],
"custom\_status\_id": 1900000838249,
"CEP": "0381000",
"Contato Assistência": "Parceiro",
"Cupom": "WQK890"
}
]
} </code></pre></td></tr></tbody></table>

***

<mark style="color:blue;">**Passo 7: Removendo propriedades indesejadas com o Transform**</mark>

Observe que o resultado no passo 06 ainda exige algumas propriedades que não são mais desejadas, como o **custom\_fields**. Vamos remover essa propriedade assim como o **sharing\_agreements\_ids** para ilustrar como remover propriedades indesejadas.

Utilizamos o operador [**Transform**](https://docs.jsonata.org/other-operators#-------transform) para executar esse tipo de remoção. A operação abaixo remove as propriedades:

```json
        $all ~> |$ |$, ["custom_fields", "sharing_agreement_ids"]|
```

Observe que invocamos a função **$all** e depois submetemos o resultado dela ao operador **Transform** que recebe três argumentos. Os dois primeiros **$** referem-se ao objeto raiz e a lista seguinte possui as propriedades que são removidas.&#x20;

Com isso, chegamos ao nosso resultado final:

<table><thead><tr><th>Input</th><th>JSONata</th><th>Output</th></tr></thead><tbody><tr><td><pre class="language-json"><code class="lang-json">{
 "tickets": [
   {
     "url": "https://soft.zendesk.com/api/v2/tickets/612022.json",
     "id": 612022,
     "external_id": null,
     "created_at": "2023-10-18T08:12:42Z",
     "updated_at": "2023-10-18T08:212:42Z",
     "subject": "Importação não funcional",
     "description": "Cliente reclama que a importação trava com o seu arquivo",
     "custom_fields": [
       {
         "id": 360032901812,
         "value": "0457000"
       },
       {
         "id": 360032943991,
         "value": "Depto Suporte"
       },
       {
         "id": 360030824791,
         "value": "XDY667"
       }
     ],
     "satisfaction_rating": null,
     "sharing_agreement_ids": [],
     "custom_status_id": 1900000838127
   },
   {
     "url": "https://soft.zendesk.com/api/v2/tickets/612011.json",
     "id": 612011,
     "external_id": null,
     "created_at": "2023-10-18T03:26:42Z",
     "updated_at": "2023-10-18T03:26:42Z",
     "subject": "Problema de acesso ao site. Cliente novo",
     "description": "Cliente reclama que o browser não dá acesso ao site",
     "custom_fields": [
       {
         "id": 360032901812,
         "value": "0381000"
       },
       {
         "id": 360032943991,
         "value": "Parceiro"
       },
       {
         "id": 360030824791,
         "value": "WQK890"
       }
     ],
     "satisfaction_rating": null,
     "sharing_agreement_ids": [],
     "custom_status_id": 1900000838249
   }
 ],
 "map": {
   "360032901812": "CEP",
   "360032943991": "Contato Assistência",
   "360030824791": "Cupom"
 }
}

</code></pre></td><td><pre class="language-json"><code class="lang-json">(

/\* Função que mapeia os customs\_fields e devolve um objeto com as propriedades \*/

$flat := function($fld)

```
   {$merge($map($fld, function($v, $i, $a) {

       {$lookup(map,$string($v.id)) : $v.value}

   }))};
```

/\* Função que executa o mapeamento para cada um dos tickets \*/

$all := $map(tickets, function($r, $s, $t) {

```
   $append($r, $flat($r.custom_fields)) ~> $merge()
```

}) \~> $append(\[]);

{

```
   /* executa e remove propriedades indesejadas */

   "tickets":$all ~> |$ |$, ["custom_fields", "sharing_agreement_ids"]|
```

}

) </code></pre></td><td><pre class="language-json"><code class="lang-json">{
"tickets": \[
{
"url": "<https://soft.zendesk.com/api/v2/tickets/612022.json>",
"id": 612022,
"external\_id": null,
"created\_at": "2023-10-18T08:12:42Z",
"updated\_at": "2023-10-18T08:212:42Z",
"subject": "Importação não funcional",
"description": "Cliente reclama que a importação trava com o seu arquivo",
"satisfaction\_rating": null,
"custom\_status\_id": 1900000838127,
"CEP": "0457000",
"Contato Assistência": "Depto Suporte",
"Cupom": "XDY667"
},
{
"url": "<https://soft.zendesk.com/api/v2/tickets/612011.json>",
"id": 612011,
"external\_id": null,
"created\_at": "2023-10-18T03:26:42Z",
"updated\_at": "2023-10-18T03:26:42Z",
"subject": "Problema de acesso ao site. Cliente novo",
"description": "Cliente reclama que o browser não dá acesso ao site",
"satisfaction\_rating": null,
"custom\_status\_id": 1900000838249,
"CEP": "0381000",
"Contato Assistência": "Parceiro",
"Cupom": "WQK890"
}
]
} </code></pre></td></tr></tbody></table>


---

# 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.skyone.cloud/skyone-studio/how-to/flattening-transformacao-de-dados-utilizando-jsonata.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.
