# Flattening: Transformación de datos utilizando JSONata

**Objetivo**\
Algunos servicios SaaS permiten la creación de campos personalizados. En este caso, se trata de campos de información creados para acompañar solicitudes de atención —también conocidas como *tickets*. Normalmente, estos campos poseen un título o una descripción; sin embargo, las APIs de estos servicios suelen utilizar identificadores numéricos para referenciarlos.

Ejemplo: Un ticket en Zendesk con campos personalizados contiene una propiedad llamada `custom_fields`, que incluye una lista de IDs y sus respectivos valores.

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

Cada *custom field* posee un nombre, pero la comunicación vía API utiliza únicamente el ID para referenciar los campos. Para trabajar con datos analíticos, vamos a “traducir” los IDs a sus nombres reales utilizando la siguiente tabla, creada específicamente con ese propósito:

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

El objetivo es transformar la información original de Zendesk en un objeto que contenga los nombres de las propiedades, como en el siguiente ejemplo:

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

### Registro de Tickets Completo

A continuación se muestra la lista del contenido JSON original que utilizaremos. Observe que existen dos tickets en una lista dentro de la propiedad **tickets**, y el mapeo está en la propiedad **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": "Importación no funcional",
     "description": "Cliente reporta que la importación se congela con su archivo",
     "custom_fields": [
       {
         "id": 360032901812,
         "value": "0457000"
       },
       {
         "id": 360032943991,
         "value": "Depto Soporte"
       },
       {
         "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 acceso al sitio. Cliente nuevo",
     "description": "Cliente reporta que el navegador no da acceso al sitio",
     "custom_fields": [
       {
         "id": 360032901812,
         "value": "0381000"
       },
       {
         "id": 360032943991,
         "value": "Socio"
       },
       {
         "id": 360030824791,
         "value": "WQK890"
       }
     ],
     "satisfaction_rating": null,
     "sharing_agreement_ids": [],
     "custom_status_id": 1900000838249
   }
 ],
 "map": {
   "360032901812": "CEP",
   "360032943991": "Contacto Asistencia",
   "360030824791": "Cupón"
 }
}
```

Y al final de la transformación deseamos llegar al siguiente 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": "Importación no funcional",
     "description": "Cliente reporta que la importación se congela con su archivo",
     "satisfaction_rating": null,
     "custom_status_id": 1900000838127,
     "CEP": "0457000",
     "Contacto Asistencia": "Depto Soporte",
     "Cupón": "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 acceso al sitio. Cliente nuevo",
     "description": "Cliente reporta que el navegador no da acceso al sitio",
     "satisfaction_rating": null,
     "custom_status_id": 1900000838249,
     "CEP": "0381000",
     "Contacto Asistencia": "Socio",
     "Cupón": "WQK890"
   }
 ]
}
```

#### Solución

Para resolver la situación, siga los siguientes pasos:

#### **Paso 1:** Crear una función que permita encontrar un nombre de *custom field* basándose únicamente en su **ID**.

Es decir, al proporcionar un ID, como por ejemplo `360035700992`, la función busca e identifica el nombre correspondiente dentro de una lista de mapeo.

Para ello usamos la función **$lookup** de JSONata, como por ejemplo:

<table><thead><tr><th>Input</th><th>JSONata</th><th>Output</th></tr></thead><tbody><tr><td><p></p><pre class="language-json"><code class="lang-json">{
 "map": {
    "360032901812": "CEP",
    "360032943991": "Contacto Asistencia",
    "360030824791": "Cupón"
  }
</code></pre></td><td><pre><code>$lookup(map, "360032901812")
</code></pre></td><td><pre><code>"CEP"
</code></pre></td></tr></tbody></table>

Observa que la función `$lookup` recibe como parámetros una lista y una cadena que contiene el nombre de la propiedad a buscar dentro de dicha lista. La función retorna el valor de la propiedad encontrada.

***

#### Paso 2: Mapear cada entrada de un *custom field* en una propiedad cuyo valor es el mismo valor del *custom field*

Para esto, utilizaremos la función [$map](https://docs.jsonata.org/higher-order-functions#map) de JSONata. Esta función recibe una lista y permite definir otra función que será ejecutada para cada uno de los elementos de la lista. Es equivalente a un ciclo `FOR` que ejecutará la función para cada elemento.

Podemos ejecutar esta operación mediante el siguiente código:

<table><thead><tr><th>Input</th><th>JSONata</th><th>Output</th></tr></thead><tbody><tr><td><p></p><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><p></p><pre><code>$map(custom_fields, function($v, $i, $a) {

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

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

Observa que la función `$map` recibió la lista `custom_fields` como parámetro. Además, especificamos una función mediante la llamada `function($v, $i, $a){}`. Las variables definidas en esta llamada reciben respectivamente los siguientes valores:

* **$v** : elemento del array que está siendo procesado
* **$i** : índice del elemento dentro del array
* **$a** : el array completo

Usamos estas variables dentro de la función para referenciar lo que necesitamos manipular.

Esta función retorna un objeto por cada elemento de la lista procesada. El contenido de ese objeto está dado por:

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

Observa que el nombre de la propiedad en la respuesta es **exactamente** el resultado de la función **$lookup** cuando buscamos en el objeto **map** la propiedad cuyo nombre coincide con el valor de la propiedad **id** del elemento que está siendo procesado (**$v.id**).

Y el valor de la respuesta es precisamente el contenido de la propiedad **value** de ese mismo elemento.

En la primera iteración de este **$map** tendremos:

<table><thead><tr><th></th><th></th></tr></thead><tbody><tr><td>$v</td><td><p></p><pre class="language-json"><code class="lang-json">{
    "id": 360032901812,
    "value": "0457000"
},
</code></pre><p></p></td></tr><tr><td>$i</td><td>0</td></tr><tr><td>$a</td><td><p></p><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>

Por lo tanto, el objeto retornado es:

```json
{"CEP" : "0457000"}
```

#### Paso 3: Unir objetos de una lista en un único objeto

Observe que la respuesta de **$map** en el paso anterior devuelve una lista donde cada objeto corresponde a una propiedad diferente.\
Ahora necesitamos unir esos objetos en un solo objeto.

Para lograrlo, utilizaremos la función **$merge**.

En nuestro ejemplo, basta con pasar el resultado de la operación anterior como parámetro de la función **$merge**.\
Esta función concatena todas las propiedades de todos los objetos de la lista en un único objeto.

<table><thead><tr><th>Input</th><th>JSONata</th><th>Output</th></tr></thead><tbody><tr><td><p></p><pre class="language-json"><code class="lang-json">{  
  "custom_fields": [
    {
      "id": 360032901812,
      "value": "0457000"
    },
    {
      "id": 360032943991,
      "value": "Depto Soporte"
    },
    {
      "id": 360030824791,
      "value": "XDY667"
    }
  ],
  "map": {
    "360032901812": "CEP",
    "360032943991": "Contacto Asistencia",
    "360030824791": "Cupón"
  }
}

</code></pre></td><td><p></p><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><p></p><pre class="language-json"><code class="lang-json">{
"CEP": "0457000",
"Contacto Asistencia": "Depto Soporte",
"Cupón": "XDY667"
} </code></pre></td></tr></tbody></table>

#### Paso 4: Función **$flat**

Sabemos que esta función del **Paso 3** deberá ejecutarse para cada uno de los tickets y, por lo tanto, tendremos que invocarla muchas veces.

Por esa razón, creamos una función que encapsula ese código y que únicamente espera la propiedad **custom\_fields** del ticket para ser ejecutada.

<table><thead><tr><th>Input</th><th>JSONata</th><th>Output</th></tr></thead><tbody><tr><td><p></p><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><p></p><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 }
```

}))
};

/\* Ejemplo de llamada de la función \*/

{"resp" : $flat(custom\_fields)}; </code></pre></td><td><p></p><pre class="language-json"><code class="lang-json">{
"resp": {
"CEP": "0457000",
"Contacto Asistencia": "Depto Soporte",
"Cupón": "XDY667"
}
} </code></pre></td></tr></tbody></table>

Observa que creamos la función **$flat** definida como:

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

El código de la función está definido dentro de las llaves, siendo exactamente igual a la función definida en el paso anterior. La única diferencia es que parametrizamos la lista de **custom\_fields** en la variable **$fld**.

Otra diferencia es que necesitamos envolver el código con paréntesis que engloben todas las especificaciones funcionales. Esto nos permite definir variables y funciones que terminen con punto y coma (`;`).

Dentro de este bloque programático necesitamos invocar la función para que JSONata ejecute efectivamente el código. Esto se hace con la siguiente línea:

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

Llamamos a la función pasando la lista definida en **custom\_fields** a la variable **$fld**. Así obtenemos el objeto que deseábamos.

Finalmente, se observa que usamos líneas de comentarios para documentar el código. Estas líneas tienen delimitadores en el formato `/* texto */`.

***

#### Paso 5: Consolidando los campos mapeados en el objeto de ticket original con la función **$merge**

En el paso 4 ya generamos un objeto que contiene los campos de **custom\_fields** mapeados. Ahora necesitamos insertar todas las propiedades de este nuevo objeto en el objeto del ticket original.

La mejor forma de hacerlo es utilizando la función **$merge**. Esta función recibe un array de objetos y consolida todas las propiedades de los objetos individuales en un único objeto.

Sin embargo, necesitamos construir un array que contenga dos objetos: uno con las propiedades originales del ticket y otro con las nuevas propiedades. Podemos hacerlo con la siguiente línea de código:

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

La función **$append**, en este caso, anexa dos objetos a una lista, siendo el primer objeto el ticket y el segundo el resultado de nuestra operación **$flat**, que también devuelve un objeto. Así, la función **$append** retorna una lista que contiene ambos objetos.

Solo nos falta ejecutar la función **$merge** sobre la lista generada. JSONata nos permite una sintaxis alternativa en la que indicamos una función que recibe como argumento el resultado del código previamente especificado. Por ejemplo:

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

En el ejemplo anterior, la función **$merge** recibe el resultado de la función **$append** como parámetro de ejecución.

A continuación, se muestra el ejemplo completo para este paso:

<table><thead><tr><th>Input</th><th>JSONata</th><th>Output</th></tr></thead><tbody><tr><td><p></p><pre class="language-json"><code class="lang-json">{
 "tickets": [
   {
     "description": "Cliente reporta que la importación se congela con su archivo",
     "custom_fields": [
       {
         "id": 360032901812,
         "value": "0457000"
       },
       {
         "id": 360032943991,
         "value": "Depto Soporte"
       },
       {
         "id": 360030824791,
         "value": "XDY667"
       }
     ]
   }
 ],
 "map": {
   "360032901812": "CEP",
   "360032943991": "Contacto Asistencia",
   "360030824791": "Cupón"
 }
}

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

/\* Función que mapea los custom\_fields y devuelve un objeto con las propiedades \*/

$flat := function($fld)

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

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

   })) };
```

{

```
   /* código de prueba */

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

}

) </code></pre></td><td><p></p><pre class="language-json"><code class="lang-json">{
"register": {
"description": "Cliente reporta que la importación se congela con su archivo",
"custom\_fields": \[
{
"id": 360032901812,
"value": "0457000"
},
{
"id": 360032943991,
"value": "Depto Soporte"
},
{
"id": 360030824791,
"value": "XDY667"
}
],
"CEP": "0457000",
"Contacto Asistencia": "Depto Soporte",
"Cupón": "XDY667"
}
}

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

Observa que la respuesta contiene todas las propiedades originales del ticket, más las propiedades generadas en el mapeo. Más adelante presentaremos una forma de eliminar el campo **custom\_fields**, que se vuelve innecesario después del mapeo.

***

#### Paso 6: Procesamiento de múltiples tickets usando **$map** y la función **$all**

Hasta el paso 5 consideramos la manipulación de un único ticket, pero podemos recibir múltiples tickets en un solo array y necesitamos procesar cada uno individualmente. Este es exactamente el propósito de la función **$map**, que será utilizada nuevamente para procesar cada ticket de manera individual.

Haremos esto creando una nueva función llamada **$all**, cuyo objetivo es procesar todos los tickets, como se define a continuación:

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

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

});
```

Básicamente, esta función ejecuta el **Paso 5** para cada uno de los tickets recibidos en el array **tickets**.

Existe un pequeño problema con este enfoque que solo se manifiesta cuando recibimos un array vacío de tickets. Tal como está, el resultado sería solo un objeto vacío.

Para garantizar que la ejecución siempre devuelva un array, incluso si está vacío, ejecutamos un **$append** vacío al final de la función. Este **$append** es inofensivo cuando la operación devuelve un array de tickets, pero será útil cuando la función devuelva vacío, ya que transformará el objeto vacío en un array vacío.

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

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

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

Con esto, nuestro código completo queda:

<table><thead><tr><th>Input</th><th>JSONata</th><th>Output</th></tr></thead><tbody><tr><td><p></p><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": "Importación no funcional",
     "description": "Cliente reporta que la importación se congela con su archivo",
     "custom_fields": [
       {
         "id": 360032901812,
         "value": "0457000"
       },
       {
         "id": 360032943991,
         "value": "Depto Soporte"
       },
       {
         "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 acceso al sitio. Cliente nuevo",
     "description": "Cliente reporta que el navegador no da acceso al sitio",
     "custom_fields": [
       {
         "id": 360032901812,
         "value": "0381000"
       },
       {
         "id": 360032943991,
         "value": "Socio"
       },
       {
         "id": 360030824791,
         "value": "WQK890"
       }
     ],
     "satisfaction_rating": null,
     "sharing_agreement_ids": [],
     "custom_status_id": 1900000838249
   }
 ],
 "map": {
   "360032901812": "CEP",
   "360032943991": "Contacto Asistencia",
   "360030824791": "Cupón"
 }
}

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

/\* Función que mapea los custom\_fields y devuelve un objeto con las propiedades \*/

$flat := function($fld)

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

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

   })) };
```

/\* Función que ejecuta el mapeo para cada uno de los tickets \*/

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

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

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

{

```
   /* ejecuta función */

   "registers": $all
```

}

)

</code></pre></td><td><p></p><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": "Importación no funcional",
"description": "Cliente reporta que la importación se congela con su archivo",
"custom\_fields": \[
{
"id": 360032901812,
"value": "0457000"
},
{
"id": 360032943991,
"value": "Depto Soporte"
},
{
"id": 360030824791,
"value": "XDY667"
}
],
"satisfaction\_rating": null,
"sharing\_agreement\_ids": \[],
"custom\_status\_id": 1900000838127,
"CEP": "0457000",
"Contacto Asistencia": "Depto Soporte",
"Cupón": "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 acceso al sitio. Cliente nuevo",
"description": "Cliente reporta que el navegador no da acceso al sitio",
"custom\_fields": \[
{
"id": 360032901812,
"value": "0381000"
},
{
"id": 360032943991,
"value": "Socio"
},
{
"id": 360030824791,
"value": "WQK890"
}
],
"satisfaction\_rating": null,
"sharing\_agreement\_ids": \[],
"custom\_status\_id": 1900000838249,
"CEP": "0381000",
"Contacto Asistencia": "Socio",
"Cupón": "WQK890"
}
]
} </code></pre></td></tr></tbody></table>

#### Paso 7: Eliminando propiedades no deseadas con **Transform**

Observe que el resultado del **Paso 6** todavía contiene algunas propiedades que ya no son necesarias, como **custom\_fields**. Vamos a eliminar esta propiedad, así como **sharing\_agreement\_ids**, para ilustrar cómo eliminar propiedades no deseadas.

Utilizamos el operador **Transform** para realizar este tipo de eliminación. La operación siguiente elimina las propiedades:

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

Observe que invocamos la función **$all** y luego enviamos su resultado al operador **Transform**, que recibe tres argumentos. Los dos primeros `$` se refieren al objeto raíz, y la lista siguiente contiene las propiedades que serán eliminadas.

Con esto, obtenemos nuestro resultado final:

<table><thead><tr><th>Input</th><th>JSONata</th><th>Output</th></tr></thead><tbody><tr><td><p></p><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": "Importación no funcional",
     "description": "Cliente reporta que la importación se congela con su archivo",
     "custom_fields": [
       {
         "id": 360032901812,
         "value": "0457000"
       },
       {
         "id": 360032943991,
         "value": "Depto Soporte"
       },
       {
         "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 acceso al sitio. Cliente nuevo",
     "description": "Cliente reporta que el navegador no da acceso al sitio",
     "custom_fields": [
       {
         "id": 360032901812,
         "value": "0381000"
       },
       {
         "id": 360032943991,
         "value": "Socio"
       },
       {
         "id": 360030824791,
         "value": "WQK890"
       }
     ],
     "satisfaction_rating": null,
     "sharing_agreement_ids": [],
     "custom_status_id": 1900000838249
   }
 ],
 "map": {
   "360032901812": "CEP",
   "360032943991": "Contacto Asistencia",
   "360030824791": "Cupón"
 }
}
</code></pre></td><td><p></p><pre class="language-json"><code class="lang-json">(

/\* Función que mapea los custom\_fields y devuelve un objeto con las propiedades \*/

$flat := function($fld)

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

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

   })) };
```

/\* Función que ejecuta el mapeo para cada uno de los tickets \*/

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

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

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

{

```
   /* ejecuta y elimina propiedades no deseadas */

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

}

) </code></pre></td><td><p></p><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": "Importación no funcional",
"description": "Cliente reporta que la importación se congela con su archivo",
"satisfaction\_rating": null,
"custom\_status\_id": 1900000838127,
"CEP": "0457000",
"Contacto Asistencia": "Depto Soporte",
"Cupón": "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 acceso al sitio. Cliente nuevo",
"description": "Cliente reporta que el navegador no da acceso al sitio",
"satisfaction\_rating": null,
"custom\_status\_id": 1900000838249,
"CEP": "0381000",
"Contacto Asistencia": "Socio",
"Cupón": "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/espanol/skyone-studio/how-to/flattening-transformacion-de-datos-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.
