Gli agenti AI di Zendesk sono chatbot basati AI che interagiscono con i clienti sui canali di messaggistica, email (inclusi API e moduli web) e voce (EAP). Possono conversare con i clienti ed eseguire azioni nei sistemi autorizzati in modo autonomo, automatizzando e risolvendo i problemi in modo che gli agenti umani possano concentrarsi su lavori più complessi.

Qual è il mio piano?
Tutte le suite Team, Growth, Professional, Enterprise o Enterprise Plus
Support Team, Professional o Enterprise

JSONata è un linguaggio di trasformazione e query open source progettato per i dati JSON che useremo per accedere e analizzare i dati da un corpo di risposta JSON restituito dall’API.

Puoi facilmente testare le query usando https://try.jsonata.org/ o, se preferisci un formato Javascript più elaborato, https://www.stedi.com/jsonata/playground . Per questa introduzione, atteniamoci al metodo di allenamento di JSONata.

L’utente lancerà il suo oggetto fittizio Invoice che useremo come punto di riferimento. I dati di input non elaborati si trovano a sinistra, la query dell’espressione JSONata si trova in alto a destra e il risultato trovato da tale espressione verrà visualizzato in basso a destra.

Per riallineare l’oggetto JSON, usa il piccolo strumento di rientro all’estrema destra dell’oggetto fittizio e salva qualsiasi espressione corrente usando la funzionalità di condivisione in alto a destra.

Per ora, questo è tutto ciò che devi sapere sull’attrezzo ginnico. Successivamente, usa una query all’interno del modello di fattura predefinito.

Se stai solo cercando informazioni chiave o un punto di riferimento dopo l’abilitazione, dai un’occhiata al nostro cheatsheet.

Mappatura dei dati

Campo a livello di radice: Account
Campo nidificato nell’oggetto radice: Account . "Nome account"
Se trova un'altra struttura JSON, puoi usare la notazione con punti per inserire i campi seguenti.

Campo nidificato in un array a livello radice:

Primo ordine in questo account:

Account.Order[0]

Promemoria: L’indicizzazione dell’array inizia da [0] per il primo elemento. Il collegamento all’ultimo elemento in un array è [-1].

Il primo colore del prodotto in questo stesso oggetto:

Account.Order[0].Product[0].Description.Colour

Recupera un array di elementi da un array di livello radice:

Se più valori corrispondono a una query, JSONata li aggregherà automaticamente.

Controlla l’intero oggetto Account.Order e recupera tutti gli OrderID in esso contenuti:

Account.Order.OrderID

Filtraggio dei dati

 

Definisci la destinazione a cui si accede, ad es

Account.Order.OrderID

Ora aggiungi la condizione nel punto corrispondente: per ogni esecuzione di un array, aggiungi una coppia di [] parentesi:

ad esempio, includi solo gli ordini con prodotti con un prezzo superiore a 30 che sono stati ordinati una sola volta e mostrano il rispettivo nome del prodotto:

Account.Order.Product[Price > 30 and Quantity = 1].'Product Name'

ad es., includi solo gli ordini con prodotti con una descrizione.Peso superiore a 1 e mostra il rispettivo OrderID:

Account.Order[Product[Description.Weight > 1]].OrderID

In alternativa, puoi anche verificare la presenza di un’affermazione veritiera, ad es

Account.Order[Product["Purple" in Description.Colour]].OrderID

Inoltre, può essere combinato con le ricerche con caratteri jolly se vuoi controllare più chiavi, ad es

Account.Order[Product["Purple" in Description.*]].OrderID

Altri operatori di percorso

( https://docs.jsonata.org/path-operators )

^( ... ) (Ordine per)

Ordina per ordine decrescente:

Account.Order^(>OrderID)

Ordina per prodotto dal più economico al più costoso:

Account.Order.Product^(Price)

* (carattere jolly)

Accedi a qualsiasi SKU indipendentemente dalla denominazione principale diretta:

Account.Order.*.SKU

Accedi a qualsiasi nome prodotto , indipendentemente dalla denominazione principale:

**.'Product Name'

% (principale)

Cerca a ritroso nella struttura dati corrente:

Account.Order.Product.{
 'Account': %.%.`Account Name`,
 'Order': %.OrderID,
 'Product': `Product Name`
}

# (Associazione di variabili di posizione)

Crea un indice, a partire da 0:

Account.Order#$i[Product.[Quantity > 0]].{
 'Order ID': OrderID,
 'Order Number': $i + 1
}

@ (Associazione di variabili di contesto)

Assegna temporaneamente una nuova struttura dati, consentendo la mappatura tra oggetti:

Account@$A.Account.Order@$O.{ 
 "Account Name": $A.'Account Name',
 "OrderID": $O.OrderID
}

Condizionali

 

Simile all’operatore ternario in JS, puoi usare ? istruzioni for if e : for else. Gli operatori booleani e/o possono essere usati per creare condizioni di catena.

SE LA CONDIZIONE È VERA? FARE QUESTO (ALTRO FARE NIENTE)

SE LA CONDIZIONE È VERA? FARE QUESTO: ALTRIMENTI FARE QUESTO

$count(Account.Order) > 1 ? "REPEAT CUSTOMER"
Account.Order[0].Product[0].Price <= 100 or Account.Order[0].Product[1].Price <= 100 ? "Bargain" : "VIP" = "Bargain"

Manipolazione dei dati

Operatori supportati

Operatore Priorità Descrizione
Moltiplica (*) 5 Moltiplica due numeri
Dividi (/) 5 Divide due numeri
Modulo (%) 5 Restituisce il resto quando si dividono due numeri
Concatena (&) 4 Concatena due stringhe
Aggiungi (+) 4 Aggiunge due numeri
Sottrai (-) 4 Sottrae due numeri
Uguale (=) 3 Verifica se due valori sono uguali
Diverso (!=) 3 Verifica se due valori non sono uguali
Maggiore di (> ) 3 Restituisce true se il valore di sinistra è maggiore del valore di destra
Maggiore o uguale a (> =) 3 Restituisce true se il valore a sinistra è maggiore o uguale al valore a destra
Meno di (< ) 3 Restituisce true se il valore di sinistra è inferiore al valore di destra
Minore o uguale a (< =) 3 Restituisce true se il valore a sinistra è minore o uguale al valore a destra
AND logico (e) 2 Restituisce true se entrambi i valori sinistro e destro sono veri
OR logico (o) 1 Restituisce true se il valore a sinistra è vero o il valore a destra è vero

es. stringhe concatenate:

Account.Order[0].Product[0].Description.Colour & " " & Account.Order[0].Product[0].'Product Name'

Funzioni integrate

Tieni presente che questi sono stati notevolmente ridotti per motivi di leggibilità. La documentazione completa è disponibile qui: https://docs.jsonata.org/overview.html 

Nota: un’espressione multilinea deve essere racchiusa tra ()

Forza tipo stringa: $string ( Account.Order[0].Product[0].ProductID ): "858383"

Tipo di numero forzato: $number ( Account.Order[0].Product[0].SKU ): 406654608

Stringa maiuscola: $maiuscolo ( Account . Order [ 0 ]. OrderID ): "ORDINE103"

Stringa minuscola: $minuscolo ( Account . Ordine [ 0 ]. Prodotto [ 0 ]. Descrizione . Colore ): "viola"

Genera un numero casuale compreso tra 0 e 1: $random ()

Conteggio oggetti in un array: $count ( Account . Order )

Conta gli oggetti in un array che soddisfano una condizione: $count ( Account . Order . Product [ Price> 30 ])

Numero di caratteri in una stringa: $length ( Account . 'Account Name' )

Sostituisci/rimuovi determinati caratteri in una stringa: $replace ( Account . Order [ 0 ]. Product [ 0 ]. 'Product Name' , "Bowler ", "" ): "Cappello"

Taglio di una stringa su un numero di caratteri specifico: $substring ( $string ( Account . Order [ 0 ]. Product [ 0 ]. ProductID ), 1 , 2 )

Taglia una stringa in base a uno schema specifico: $substringAfter ( Account . Order [ 0 ]. OrderID , "order" )

Risultato simile usando split + join:

$join ( $split ( Account . Order [ 0 ]. Product [ 0 ]. 'Product Name', " "), '_' )

Può anche essere scritto come ~> funzione:

$split ( Account . Ordine [ 0 ]. Prodotto [ 0 ]. 'Nome prodotto', " ") ~> $join('_' )

Controlla se una stringa contiene un modello specifico: il modello può essere una stringa esatta o un’espressione regolare:

$contains ( Account . Order [ 0 ]. Product [ 0 ]. 'Product Name' , "Hat" )

Date e orari

La maggior parte delle date verrà superata secondo lo standard internazionale ISO 8601 e avrà il seguente aspetto 2023-04-20T13:09:39+00:00 (informazioni sul fuso orario di trasporto) o 2023-04-20T13:09:39Z (con chiave in millisecondi offset da UTC). Sono ben leggibili, ma non possono essere manipolati in modo nativo da JSONata. 

Spesso, dovrai quindi trasformarli in tempo UNIX, che è il numero letterale di secondi trascorsi dalle 00:00:00 UTC del 1 gennaio 1970 (Epoca Unix), che non è più leggibile dal punto di vista umano, ma come numero intero può essere aggiunto/sottratto/confrontato con altre date UNIX. JSONata funziona in modo nativo con Millis, che sono i MILLISECONDS dall’epoca Unix (quindi UNIX * 1000).

$ora (): "2023-04-20T13:39:58.216Z"

$milli (): 1681998518175

Ora questi millis possono essere ritrasformati in un formato data a tua scelta definendo un’immagine (il tuo modello di destinazione) in una stringa: https://www.w3.org/TR/xpath-functions-31/#date-picture -string

Esempi di pattern: https://www.w3.org/TR/xpath-functions-31/#date-time-examples

Identificatore Significato
Y Anno (valore assoluto)
M Mese nell’anno
D Giorno nel mese
F Giorno in settimana
H Ora nel giorno (24 ore)
h Ora in mezza giornata (12 ore)
P Indicatore AM/PM
m Minuto in ora
s Secondo in minuto
Z Fuso orario

ad es. $fromMillis ( $millis (), '[M]/[G]/[Y01]' ) restituisce "4/20/23" , 

$fromMillis ( $millis (), '[D01].[M01].[Y0001] [H#1]:[m01]' ) restituisce "20.04.2023 13:51" .

Mettiamolo in pratica: supponiamo che tu abbia due date nei dati delle risposte e che tu voglia controllare quanti giorni sono trascorsi da OGGI.

"2023-04-20T00:00:00.000Z"

"20.04.2023"

Trasformali entrambi in Milis: la seconda data non è nel modello ISO 8601 standard, quindi dovrai fornire l’immagine affinché JSONata possa sapere quale valore è il tuo giorno, mese, anno e qualsiasi informazione temporale potresti avere a disposizione.

$toMillis ( '2023-04-20T00:00:00.000Z' ) : 1681948800000

$toMillis ( '20.04.2023' , '[D01].[M01].[Y0001]' ): 1681948800000

Puoi anche visualizzare l’ora corrente in Milis tramite la funzione standard $millis(): 1681999968402

Ora puoi semplicemente sottrarre l’una dall’altra e ricevere la differenza tra le due date in millisecondi: 1681999968402 - 1681948800000 = 51296367

Usando la conversione temporale comune:

1000 millisecondi = 1 secondo

60 sec = 1 minuto

60 min = 1 ora

E arrotondando per difetto il risultato, ricevi un totale di 14 ore trascorse da adesso al timestamp fornito:

$round (51296367 / 1000 / 60 / 60 ) = 14

Combinata in una riga, stai esaminando un’operazione di:

$round(($millis() - $toMillis('20.04.2023', '[D01].[M01].[Y0001]')) / 1000 / 60 / 60)

Output speciali

Ticket “Oneliner”

Poiché potresti avere una sola possibilità di risposta, ti consigliamo di trasmettere quante più informazioni possibili in un singolo parametro. JSONata gestisce l’aggregazione per te in modo che tu possa giocare liberamente con la copia di testo.

Supponiamo che tu voglia visualizzare gli SKU e i prezzi di tutti i prodotti nel tuo ordine:

Account.Order.Product

Poiché alla fine vuoi solo avere una grande riga di testo con tutti i prodotti considerati, puoi semplicemente creare un array condiviso con tutte le informazioni richieste:

Account.Order.Product.(SKU & Price)

Ora devi solo combinarli in un’unica grande stringa con un carattere di interruzione di riga come separatore:

$join(Account.Order.Product.("SKUs: " & SKU & ", " & "Price: " & Price), "\n")

Nota: Considera i limiti del CRM: Zendesk Support offre una formattazione di base, quindi a \n si tradurrà correttamente in un’interruzione di riga durante il rendering di un’email di risposta, ma ciò potrebbe non essere il caso per tutti i sistemi.

Schede e sequenze

Le schede e le sequenze sono il vero punto di forza di JSONata poiché gestisce la query e l'aggregazione dei dati in modo nativo, a condizione che la risposta segua lo stesso schema. Un C&C è costituito da una serie di oggetti in cui ogni oggetto rappresenta una delle tue schede. Un esempio molto semplice di struttura C&C con 2 schede potrebbe essere simile al seguente:

[
 {
   "imageURL": data.url1,
   "title": data.title1,
   "description": data.description1
 },
 {
   "imageURL": data.url2,
   "title": data.title2,
   "description": data.description2
 }
]

È importante che tutti gli oggetti nell’array seguano la stessa struttura in modo che sia possibile accedervi tramite la stessa chiave condivisa. Assicurati anche di tenere a mente i limiti del tuo CRM .

Per un esempio semplice, costruiamo di nuovo un C&C sui dati di esempio della fattura. Iniziamo con un array sin dall’inizio: qualsiasi risultato di query con più di un oggetto risposta verrà convertito automaticamente in un array, ma è consigliabile disporre di questa opzione di sicurezza nel caso in cui il risultato contenga un solo oggetto. 

[Account.Order.Product.'Product Name']
[Account.Order.Product.SKU]
[Account.Order.Product.Description.Colour]

Questi sono alcuni dei campi che ci interessano. Uniamoli in un unico oggetto: assicurati di assegnare un nome a ciascuna chiave nell’oggetto di destinazione:

[
 Account.Order.Product.
  {
   "name": 'Product Name', 
   "sku": SKU, 
   "colour": Description.Colour
  }
]

Se hai bisogno di un valore di un livello superiore, puoi semplicemente iniziare la query a un livello superiore. Se vuoi includere anche [ Account . Ordina . OrderID ] nell’array:

[
 Account.Order.
  {
   "orderId": OrderID, 
   "name": Product.'Product Name', 
   "sku": Product.SKU, 
   "Colour": Product.Description.Colour
  }
]

Noterai che non esiste più una corrispondenza diretta 1:1 poiché ogni ordine può contenere più elementi, motivo per cui questa risposta crea array di stringhe apparentemente casuali. Puoi risolvere il problema accedendo indirettamente all’oggetto principale (consulta Associazione principale), assegnando temporaneamente una struttura di oggetti diversa in JSONata (consulta Associazione di variabili di contesto), aggiungendo un C&C secondario che scorre gli elementi nell’ordine scelto o trasformando ulteriormente i dati. a seconda della tua UX ideale. Ecco un esempio trasformato:

[
 Account.Order.
  {
   "orderId": OrderID, 
   "name": $join(Product.'Product Name', ", "), 
   "totalPrice": $sum(Product.Price)
  }
]

Se vuoi rendere più sicura la query, aggiungiamo alcuni fail safe nel caso in cui non disponi dei dati di risposta previsti (per coprire, ad esempio, un 404) e un limite nel caso in cui la risposta restituisca più risultati di quelli che il tuo CRM può assistenza (ad esempio 10 per i widget SunCo):

Account.Order ? 
 [Account.Order[[0..9]].
  {
   "orderId": OrderID, 
   "name": $join(Product.'Product Name', ", "), 
   "totalPrice": $sum(Product.Price)}] 
: [{"orderId": "???", "name": "Cannot find your item?"}]

IMPORTANTE: Assicurati che tutte le chiavi C&C seguano la convenzione camelCase , _ i nomi dei parametri non sono supportati.

Ora tutte queste chiavi, ad esempio orderId, name, totalPrice, saranno disponibili per il tuo Carousel. Imposta il tipo di sequenza su dinamico nell’interfaccia utente e aggiungi il nome del parametro che ospita la query qui sopra, ad esempio orderList .

Ora puoi accedere a qualsiasi chiave negli oggetti dell’array aggiungendo una scorciatoia %, o generandole direttamente nella chat sulle schede:

Oppure memorizzandoli nella sessione inserendo nella scheda scelta un’azione che fa riferimento alla chiave dell’oggetto scelto in un nome di parametro a tua scelta, ad esempio:

 

Avvertenza sulla traduzione: questo articolo è stato tradotto usando un software di traduzione automatizzata per fornire una comprensione di base del contenuto. È stato fatto tutto il possibile per fornire una traduzione accurata, tuttavia Zendesk non garantisce l'accuratezza della traduzione.

Per qualsiasi dubbio sull'accuratezza delle informazioni contenute nell'articolo tradotto, fai riferimento alla versione inglese dell'articolo come versione ufficiale.

Powered by Zendesk