Como podemos ajudar?

04. Exemplos no Json
24 min
Criado por Humanz em 03/06/2022 12:34
Atualizado por Maria Malheiro em 19/10/2023 09:44
Antes de começarmos...
Para que você consiga executar as configurações a seguir, é sugerido dominar os conceitos de variáveis na Zenvia Bots e principalmente a estrutura Json (artigo).
 
As declarações de variáveis sempre estarão estruturadas no Json da seguinte forma:
1
2
3
4
"variables": {
"variavel_nova": "valor",
"variavel_nova2": "valor2"
},

Nome automático no WhatsApp

Em um fluxo do canal WhatsApp, é possível absorver automaticamente o dado, pois irá aparecer o nome cadastrado no WhatsApp do usuário, não precisando declarar nenhuma variável.
 
Nome da variável (da sua escolha), exemplo: 'nome_whats'
Valor: visitor.firstName
Print: #{visitor.firstName}
1
2
3
"variables": {
"nome_whats": "visitor.firstName"
},

Número automático no WhatsApp

Em um fluxo de canal WhatsApp, caso seja declarada uma variável com o nome de "telefone_whats", por exemplo, basta inserir seu valor como "from" que ao imprimir o número de telefone será mostrado automaticamente.
 
Nome da variável (da sua escolha), exemplo: 'telefone_whats'
Valor: from
Print: #{from}
1
2
3
"variables": {
"telefone_whats": "from"
},

Descobrir hora atual

Permite inserir em uma variável a hora atual GMT-3 (Brasil).
 
Nome da variável (da sua escolha), exemplo: 'horaInicial'
Valor: #time.format((#time.now()).minusHours(3), 'HH:mm:ss')
Print: #{horaInicial}
1
2
3
"variables": {
"horaInicial": "#time.format((#time.now()).minusHours(3), 'HH:mm:ss')"
},

Descobrir data atual

Permite inserir em uma variável a data atual.
 
Nome da variável (da sua escolha), exemplo: 'dataInicial'
Valor: T(java.time.LocalDate).now().format(T(java.time.format.DateTimeFormatter).ofPattern('dd/MM/yyyy'))
Print: #{dataInicial}
1
2
3
"variables": {
"dataInicial": "T(java.time.LocalDate).now().format(T(java.time.format.DateTimeFormatter).ofPattern('dd/MM/yyyy'))"
},

Descobrir o dia da semana

Permite alocar em uma variável os valores de dia da semana em inglês: MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY.
 
Nome da variável (da sua escolha), exemplo: 'diaSemana'
Valor: T(java.time.LocalDateTime).now(T(java.time.ZoneId).of('America/Sao_Paulo'))
Print: #{diaSemana.toString()}
1
2
3
"variables": {
"diaSemana": "T(java.time.LocalDateTime).now(T(java.time.ZoneId).of('America/Sao_Paulo'))"
},

Imprimir valor de mapa (LinkedHashMap) para string

Há retornos de API que não são string (texto) e por isso não é possível imprimir durante a jornada no Flow. Logo, basta inserir ".toString()" ao final da variável que conseguirá aparecer o dado.
 
variavel recebe response.toString()
Ou a partir de algum retorno, pode ser impresso diretamente na mensagem:
 
Print: #{variavel.toString()}

Extrair histórico da conversa até X momento

O histórico será organizado no momento que for configurado o valor da expressão abaixo. Ou seja, irá conseguir capturar tudo que foi conversado pelo fluxo até o momento da declaração da variável no componente.
 
43caef78-3041-4d15-abb9-19aa9abbb24b.png
 
Nome da variável (da sua escolha), exemplo: 'historico'
Valor: #stateFunction.get(session['sessionId'])
1
2
3
"variables": {
"historico": "#stateFunction.get(session['sessionId'])"
},
Declare a variável e depois imprima no fluxo ou faça o que quiser. Por exemplo: enviar como conteúdo em uma chamada de API para algum outro sistema:
 
cd712c36-4ccc-4e0c-9cfa-0f5b0effaffe.png
 
Exemplo do print completo do histórico:
 
1fec6a63-8190-4025-b793-24f927cdbfa2.png
I
 
  • Imagem do Json:
 
 
  • Código Json:
1
2
3
"defaultConversationalChannel": "CHAT",
  "historic": true
}
  • Código do fluxo de testes, para conhecimento:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
{
  "alias": "General Test Boeira",
  "description": "",
  "steps": [
    {
      "id": "idEventoInicial",
      "type": "chatEvent",
      "label": "Evento inicial",
      "properties": {
        "startEvent": "true"
      },
      "variables": {
        "chatFrom": "ID_WEBCHAT_AQUI"
      },
      "conditions": [
        {
          "type": "channelSourceCondition",
          "values": [
            "ID_WEBCHAT_AQUI"
          ]
        }
      ]
    },
    {
      "id": "idEventoFinal",
      "type": "endEvent",
      "label": "label 3",
      "properties": {
        "endEvent": "true"
      }
    },
    {
      "id": "step0",
      "type": "sendChatActivity",
      "properties": {
        "from": "#{session['chatFrom']}"
      },
      "contents": [
        {
          "type": "text/plain",
          "payload": {
            "text": "Começou a conversa..."
          }
        }
      ]
    },
    {
      "id": "step02",
      "type": "callComponent",
      "properties": {
        "componentId": "4d242136-a4e2-46b2-bf4f-77a7a265e622",
        "timeUnit": "minute",
        "expirationInMinutes": ""
      },
      "inputs": {
        "question": "'Qual o seu e-mail?'",
        "max_tries": "3",
        "question_when_invalid_answer": "'Não entendi, poderia me informar seu e-mail? (Ex.: abc@seudominio.com)'",
        "message_exhausted_attempts": "'Infelizmente não consegui entender seu e-mail.'"
      },
      "label": "Valida E-mail"
    },
    {
      "id": "step03",
      "type": "sendChatActivity",
      "properties": {
        "from": "#{session['chatFrom']}"
      },
      "contents": [
        {
          "type": "text/plain",
          "payload": {
            "text": "Responda algo..."
          }
        }
      ]
    },
    {
      "id": "step04",
      "type": "chatEvent",
      "variables": {
        "answer": "payload"
      }
    },
    {
      "id": "step05",
      "type": "nop",
      "properties": {
        "timeUnit": "minute",
        "expirationInMinutes": ""
      },
      "variables": {
        "historico": "#stateFunction.get(session['sessionId'])"
      }
    },
    {
      "id": "step06",
      "type": "sendChatActivity",
      "properties": {
        "from": "#{session['chatFrom']}"
      },
      "contents": [
        {
          "type": "text/plain",
          "payload": {
            "text": "Print do Histórico:\n#{historico}"
          }
        }
      ]
    }
  ],
  "connections": [
    {
      "from": "idEventoInicial",
      "to": "step0"
    },
    {
      "from": "step0",
      "to": "step02"
    },
    {
      "from": "step02",
      "to": "step03"
    },
    {
      "from": "step03",
      "to": "step04"
    },
    {
      "from": "step04",
      "to": "step05"
    },
    {
      "from": "step05",
      "to": "step06"
    },
    {
      "from": "step06",
      "to": "idEventoFinal"
    }
  ],
  "defaultConversationalChannel": "CHAT",
  "historic": true
}

Verificar o tamanho do array

Você pode imprimir após uma chamada de API o tamanho do array do response (retorno da chamada).
 
Nome da variável (da sua escolha), exemplo: 'tamanho_array'
Valor: response.size
Print: #{response.size()}

Cortar alguma palavra ou retorno de API (substring)

Permite o usuário a controlar o número de caracteres do texto e alocar em outra variável, um valor cortado. Muito utilizado para gestão de números ou informações muito grandes. 
 
Nome da variável (da sua escolha), exemplo:
valor_entrada recebe o valor de retorno da API
valor1_cortado recebe valor_entrada.substring(0,3)"
 
Isso significa que a variável valor1_cortado terá o valor dos caracteres da posição 0 até 3 da variável original valor_entrada
1
2
3
4
"variables": {
"valor_entrada": "response",
"valor1_cortado": "valor_entrada.substring(0,3)"
},

Colocar ponto no meio de uma string

A partir do exemplo acima, podemos concatenar duas variáveis, inserindo um ponto ou qualquer outro dado no meio. Regra utilizada para isso é o .concat('XXX')
 
valor_entrada recebe payload
valor1 recebe valor_entrada.substring(0,3)
valor2 recebe valor_entrada.substring(3,6)
valorFinal recebe valor1.concat('.').concat(valor2)
1
2
3
4
5
6
"variables": {
"valor_entrada": "payload",
"valor1": "valor_entrada.substring(0,3)",
"valor2": "valor_entrada.substring(3,6)",
"valorFinal": "valor1.concat('.').concat(valor2)"
},

Transformar valor float em moeda

Ao receber um valor da API em float, é possível transformá-lo em moeda nos padrões atuais. Exemplo:
 
API retorna um valor e cria-se a variável parcela1 = 2802.2367052945056
 
Crie a variável varFloat, que recebe new java.lang.Float(parcela1)
Crie a variável decimalInst, que recebe new java.text.DecimalFormat('R$ #,###.00', new java.text.DecimalFormatSymbols(new java.util.Locale('pt','BR'))).format(varFloat)
1
2
3
4
"variables": {
"varFloat": "new java.lang.Float(parcela1)",
"decimalInst": "new java.text.DecimalFormat('R$ #,###.00', new java.text.DecimalFormatSymbols(new java.util.Locale('pt','BR'))).format(varFloat)"
},
E imprima a variável decimalInst, que terá o valor de R$ 2.802,24, conforme o exemplo:
 
#{decimalInst}

Alocar em uma variável o valor dos objetos de um array, listando sem precisar de loop

É possível declarar as variáveis maxPedidos, contador, nroPedidos (nomenclatura livre para escolha) no componente de variáveis e depois realizar a gestão dos dados para absorver o response.
1
2
3
4
5
"variables": {
"maxPedidos": "response.obj.json.size()",
"contador": "0",
"nroPedidos": "response.obj.json.![PEDIDO]" 
},

Converter string para Int

1
2
3
4
"variables": {
"variavel": "payload",
"variavel_int": "function.extractInteger(variavel_string)"
},

Operação matemática a partir de string

Utilizamos da função function.extractInteger (variavel_fluxo) para transformar o valor (string) entre parênteses colhido durante o fluxo em Número e assim realizar operações matemáticas utilizando: +, -, * ou /.
 
Exemplo para calcular o valor total das camisetas:
 
Crie uma variável que recebe o valor unitário e outra com a quantidade de camisetas.
 
valorUnitario recebe algum valor
qtCamisetas recebe algum valor
calculoFinal recebe function.extractInteger(valorUnitario) * function.extractInteger(qtCamisetas)
 
No caso, iremos multiplicar valorUnitario com qtCamisetas. E o valor da variável calculoFinal será o número final.
1
2
3
4
5
"variables": {
"valorUnitario": "12",
"qtCamisetas": "2"
"calculoFinal": "function.extractInteger(valorUnitario) * function.extractInteger(qtCamisetas)"
},

Embedded de vídeo no flow

Inserir na mensagem do bot (corpo) um vídeo.
 
<iframe width="560" height="315" src="https://www.youtube.com/embed/XXXXXXX" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

If ternário

Caso seja necessário realizar validações de associações de valores, utilize esse trecho no Json. Lembrando que a palavra payload exemplifica qualquer nome de variável que houver no fluxo, e tudo que está entre aspas simples, são os valores em string dos retornos. Exemplo: 
 
variavel_final recebe o valor payload == '1' ? 'Agendamento' : payload == '2' ? 'Compras' : payload == '3' ? 'Financeiro' : payload == '4' ? 'Comercial' : payload == '5' ? 'SAC' : payload == '6' ? 'Unidade BR' : payload == '7' ? 'Unidade USA' :  payload
 
1
2
3
"variables":{
      "variavel_final": "payload == '1' ? 'Agendamento' : payload == '2' ? 'Compras' : payload == '3' ? 'Financeiro' : payload == '4' ? 'Comercial' : payload == '5' ? 'SAC' : payload == '6' ? 'Unidade BR' : payload == '7' ? 'Unidade USA' : payload"
},
Exemplo de previsão do tempo, pelo retorno de uma API e seus valores:
1
2
3
4
5
"variables": {
        "icone1": "previsao_condition1 == 'clear_day' ? '☀️' : previsao_condition1 == 'cloudy_day' ? '⛅️' : previsao_condition1 == 'rain' ? '🌧️': '☁️'",
        "icone2": "previsao_condition2 == 'clear_day' ? '☀️' : previsao_condition2 == 'cloudy_day' ? '⛅️' : previsao_condition2 == 'rain' ? '🌧️': '☁️'",
        "icone3": "previsao_condition3 == 'clear_day' ? '☀️' : previsao_condition3 == 'cloudy_day' ? '⛅️' : previsao_condition3 == 'rain' ? '🌧️': '☁️'"
      }

Como criar um loop de tentativas

É possível declarar variáveis que façam contagem a partir de um determinado número e a partir do tratamento do fluxo, quando chegar ao número X determinado, a jornada é direcionada. Exemplo:
 
Criar variável com nome (da sua escolha): 'tentativa'
Inserir na variável 'tentativa' o valor 0 (o número zero), representando o ponto de partida
 
Caso a validação no Ponto de Decisão for inválido (usuário errou ao digitar ou outra regra no tratamento de inválido), é possível acrescentar +1 à variável 'tentativa', ficando: "tentativa" recebe session ['tentativa']+1. Insira essa regra no Json do Tratamento de Inválido:
1
2
3
"variables": {
  "tentativa": "tentativa +1"
}
Ou seja, a variável 'tentativa' recebe ela mesma +1.
 
E no branch (decisão), para limitar o número de loop, insira uma regra, como por exemplo:
 
Limite de tentativas: session['tentativa'] > 3
30013b25-e21d-4526-b255-9455677e49fe.png
No exemplo acima, enquanto a variável não for maior que 3, o loop continua acontecendo.
<a href="https://html.com/attributes/a-href/">Learn about the a href attribute</a> 

Validar 3 dígitos do CPF conforme arquivo de disparo

 É possível verificar tanto o dado do arquivo quanto o dado que o cliente digitou. Basta você utilizar o substring que irá validar o que o cliente digitou com o CPF. 
 
É possível confirmar o CPF todo ou a quantidade que desejar, basta alterar o 3 (3 primeiros dígitos) por um número até 11.
 
No branch / decisão:
 
confirmaCpf == attribute['cpf'].substring(0,3)
 
confirmaCpf, no caso, é a resposta final do cliente(variável)
O CPF do arquivo está localizado na variável 'cpf', onde contém 11 dígitos
Logo, a validação é se nas três primeiras casas de 'cpf', é encontrado o que o cliente digitou.

Igualar uma string à outra (resultado booleano - verdadeiro ou falso )

confirmacpf.substring(0,3).equals(session['website']['extra']['cpf'].substring(0,3))

Comparar duas strings ao mesmo tempo

Resp4_ValorResidencial matches '\d*' && T(Float).parseFloat(Resp4_ValorResidencial) > 60000.0

Potencialização

3.power(expoente)

Cortar string até um caractere separador

#{frase.substring(0,frase.indexOf("."))}

Isolar número sem formatação

#{dividas.replaceAll('[\\D]*([0-9.]+).*', '$1').replaceAll('\\.', '')}

Testar cada caractere da string para ver se ela é composta só de espaços em branco

#string.isBlank(variável)

Validar valor monetário (só a parte inteira)

payload.replaceAll('[\D]*([0-9.]+).*', '$1').replaceAll('\.', '')

Limpar formatação e pegar só o número

(VARIÁVEL.replaceAll(\"[^0123456789]\", \"\")) <= 10

Cortar uma string a partir de determinado caractere

#{answer.substring(answer.indexOf(".")+1)}
String: usuario.um
Resultado da função: um

Validar se a string tem exatamente o tamanho X de caracteres

variavel.length() == 7

Gerar número randômico

"variavel_token": "#random.randomNumeric(10)"