Zendesk AI 상담사는 메시징, 이메일(API 및 웹 양식 포함) 및 음성(EAP) 채널에서 고객과 상호작용하는 AI 기반 챗봇입니다. 고객과 대화하고 승인된 시스템에서 자율적으로 작업을 수행하여 문제를 자동화하고 해결하여 실제 상담사가 좀 더 복잡한 작업에 집중할 수 있도록 할 수 있습니다.

사용 중인 플랜
모든 Suite Team, Growth, Professional, Enterprise 또는 Enterprise Plus
Support Team, Professional 또는 Enterprise

JSONata는 API 리턴 JSON 응답 본문에서 데이터에 액세스하고 구문 분석하는 데 사용할 JSON 데이터용으로 설계된 오픈 소스 쿼리 및 변환 언어입니다.

https://try.jsonata.org/를 사용하여 쿼리 를 쉽게 테스트할 수 있습니다. 이 소개에서는 JSONata의 자체 연습기를 계속 사용하겠습니다.

연습 담당자는 참조 포인트로 사용할 청구서 더미 개체를 시작합니다. 원시 입력 데이터는 왼쪽에, JSONata 표현식 쿼리는 오른쪽 위에 있으며, 해당 표현식으로 찾은 결과는 오른쪽 아래에 렌더링됩니다.

JSON 개체를 다시 정렬하려면 더미 개체 오른쪽에 있는 작은 들여쓰기 도구를 사용하고 오른쪽 위에 있는 공유 기능을 사용하여 현재 표현식을 저장합니다.

지금은 연습기에 대해 알아야 할 전부입니다! 다음은 기본 청구서 기본서식 내에서 쿼리를 사용합니다.

사용 설정 후 주요 내용이나 참고자료를 찾고 계신다면 Zendesk의 요약 자료를 확인해 보세요.

데이터 맵핑

루트 수준 필드: 계정
루트 개체의 중첩 필드: 계정 . '계정 이름'
다른 JSON 구조를 찾으면 점 표기법을 사용하여 아래 필드를 입력할 수 있습니다.

루트 수준 배열의 중첩 필드:

이 계정의 첫 번째 주문:

Account.Order[0]

미리 알림: 배열 인덱싱은 첫 번째 항목의 [0]에서 시작합니다. 배열의 마지막 항목에 대한 바로 가기는 [-1]입니다.

이 동일한 개체에서 첫 번째 제품의 색:

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

루트 수준 배열에서 항목 배열을 검색합니다.

여러 값이 쿼리와 일치하면 JSONata가 자동으로 집계합니다.

전체 개체 Account.Order를 확인하고 그 안의 모든 OrderID를 검색합니다.

Account.Order.OrderID

데이터 필터링하기

 

액세스 중인 대상을 정의합니다. 예:

Account.Order.OrderID

이제 일치하는 위치에 조건을 추가합니다. 배열을 실행할 때마다 한 쌍의 [] 브래킷을 추가합니다.

예를 들어 한 번만 주문된 가격이 30보다 높은 제품이 있는 주문만 포함하고 해당 제품 이름을 표시합니다.

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

예를 들어 설명이 1보다 큰 제품이 있는 주문만 포함하고 각각의 주문 ID를 표시합니다.

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

또는 다음과 같이 사실이 맞는지 확인할 수도 있습니다.

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

또한 여러 키를 확인하려는 경우 와일드카드 검색과 결합할 수 있습니다.

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

기타 경로 연산자

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

^( ... ) (순서 기준)

OrderID 내림차순 정렬:

Account.Order^(>OrderID)

가장 저렴한 제품부터 가장 비싼 제품순으로 정렬:

Account.Order.Product^(Price)

* (와일드카드)

직접 상위 이름 지정에 관계없이 모든 SKU에 액세스:

Account.Order.*.SKU

상위 이름 지정에 관계없이 모든 제품 이름 에 액세스:

**.'Product Name'

%(상위)

현재 데이터 구조에서 뒤로 검색:

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

# (위치 변수 결합)

0에서 시작하는 인덱스를 만듭니다.

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

@(컨텍스트 변수 바인딩)

임시로 새 데이터 구조를 배정하여 개체 간 맵핑을 허용합니다.

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

조건부

 

JS의 삼항 연산자와 마찬가지로 ? if 및 : else 문. 부울 연산자 및/또는 을 사용하여 체인 조건을 만들 수 있습니다.

IF CONDITION IS TRUTHY? 다음과 같이 하세요(그렇지 않으면 아무 것도 하지 않음)

IF CONDITION IS TRUTHY? 다음과 같이 하세요. 그렇지 않으면 다음과 같이 하세요.

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

데이터 조작하기

지원되는 연산자

연산자 우선 순위 설명
곱하기(*) 5 두 개의 숫자를 곱합니다.
나누기(/) 5 두 개의 숫자를 나눕니다.
모듈러스(%) 5 두 숫자를 나눌 때의 나머지를 리턴합니다.
연결(&) 4 두 개의 문자열을 연결합니다.
추가(+) 4 두 개의 숫자를 더합니다.
빼기(-) 4 두 개의 숫자를 뺍니다.
같음(=) 3 두 값이 같은지 테스트합니다.
같지 않음(!=) 3 두 값이 같지 않은지 여부를 테스트합니다.
다음보다 큼(> ) 3 왼쪽 값이 오른쪽 값보다 크면 true를 리턴합니다.
다음보다 크거나 같음(> =) 3 왼쪽 값이 오른쪽 값보다 크거나 같으면 true를 리턴합니다.
다음보다 작음(< ) 3 왼쪽 값이 오른쪽 값보다 작으면 true를 리턴합니다.
다음보다 작거나 같음(< =) 3 왼쪽 값이 오른쪽 값보다 작거나 같으면 true를 리턴합니다.
논리 AND(및) 2 왼쪽 값과 오른쪽 값이 모두 true이면 true를 리턴합니다.
논리 OR(또는) 1 왼쪽 값이 true이거나 오른쪽 값이 true이면 true를 리턴합니다.

예: 문자열 연결하기:

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

기본 제공 함수

가독성을 위해 이러한 내용을 요약해 놓았습니다. 전체 문서는 https://docs.jsonata.org/overview.html 에서 확인할 수 있습니다. 

참고: 여러 줄 표현식은 ()로 묶어야 합니다.

강제 문자열 유형: $string ( Account.Order[0].Product[0].ProductID ): "858383"

강제 번호 유형: $number ( Account.Order[0].Product[0].SKU ): 406654608

대문자 문자열: $uppercase ( Account . Order [ 0 ]. OrderID ): "ORDER103"

소문자 문자열: $lowercase ( Account . Order [ 0 ]. Product [ 0 ]. Description . Color ): "purple"

0과 1 사이의 난수 출력: $random ()

배열의 개체 개수: $count ( Account . Order )

배열에서 다음 조건과 일치하는 개체 수: $count ( Account . Order . Product [ Price> 30 ])

문자열의 문자 수: $length ( Account . 'Account Name' )

문자열에서 특정 문자 바꾸기/제거: $replace ( Account . Order [ 0 ]. Product [ 0 ]. 'Product Name' , "Bowler ", "" ): "모자"

특정 문자 수에 대한 문자열 잘라내기: $substring ( $string ( Account . Order [ 0 ]. Product [ 0 ]. ProductID ), 1 , 2 )

특정 패턴에서 문자열 잘라내기: $substringAfter ( Account . Order [ 0 ]. OrderID , "order" )

split + 조인을 사용한 유사한 결과:

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

~로 쓸 수도 있습니다.> 함수:

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

문자열에 특정 패턴이 포함되어 있는지 확인합니다. 패턴은 정확한 문자열 또는 정규식일 수 있습니다.

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

날짜 및 시간

대부분의 날짜 는 ISO 8601의 국제 표준을 통과하며 다음과 같이 표시됩니다 . UTC로부터 오프셋). 사람이 쉽게 읽을 수 있지만 기본적으로 JSONata로 조작할 수는 없습니다. 

따라서 종종 1970년 1월 1일 00:00:00 UTC(Unix Epoch) 이후 문자 그대로 경과한 초 수인 UNIX 시간으로 변환해야 합니다. 다른 UNIX 날짜와 비교하여 더하거나 뺄 수 있습니다. JSONata는 기본적으로 Unix Epoch(즉 UNIX * 1000) 이후의 MILLISECONDS인 Millis와 함께 작동합니다.

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

$밀리 (): 1681998518175

이제 문자열에서 그림(대상 패턴)을 정의하여 이러한 밀리 단위를 원하는 날짜 형식으로 다시 변환할 수 있습니다. https://www.w3.org/TR/xpath-functions-31/#date-picture -string

패턴 예: https://www.w3.org/TR/xpath-functions-31/#date-time-examples

지정자 의미
예 연도(절대값)
M 월(연도 기준)
D 한 달 기준 일
F 일(주)
H 하루 중 시간(24시간)
높이 반나절 후 1시간(12시간)
P 오전/오후 표식
분 분(1시간 기준)
s 초(1분 기준)
Z 시간대

예: $fromMillis ( $millis (), '[M]/[D]/[Y01]' )은 "4/20/23"을 리턴합니다. 

$fromMillis ( $millis (), '[D01].[M01].[Y0001] [H#1]:[m01]' ) 은 "20.04.2023 13:51" 을 리턴합니다.

실제로 응답 데이터에 두 개의 날짜가 있고 오늘 이후 며칠이 지났는지 확인하려는 경우를 가정해 보겠습니다.

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

"20.04.2023"

두 날짜를 모두 Milis로 변환합니다. 두 번째 날짜는 표준 ISO 8601 패턴이 아니므로 JSONata가 시간 정보는 물론 일, 월, 연도 값을 알 수 있도록 사진을 제공해야 합니다. 을(를) 사용할 수 있습니다.

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

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

표준 함수 $millis()를 통해 밀리초의 현재 시간도 알 수 있습니다. 1681999968402

이제 다른 날짜에서 하나를 빼고 두 날짜의 차이를 밀리초 단위로 받을 수 있습니다. 1681999968402 - 1681948800000 = 51296367

일반 시간 변환 사용하기:

1000밀리초 = 1초

60초 = 1분

60분 = 1시간

결과를 내림하면 지금과 제공된 타임스탬프 사이에 경과한 총 14시간이 표시됩니다.

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

한 줄로 결합하면 다음 작업이 표시됩니다.

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

특수 출력

티켓 “Onliners”

한 번만 답장을 보낼 수 있으므로 하나의 매개변수에 가능한 많은 정보를 전달해야 합니다. JSONata가 집계를 처리하므로 자유롭게 텍스트 사본을 사용할 수 있습니다.

주문에 있는 모든 제품의 SKU 및 가격을 렌더링한다고 가정해 보세요.

Account.Order.Product

궁극적으로 모든 제품을 고려한 한 줄의 큰 텍스트만 원하므로 필요한 모든 정보로 하나의 공유 배열을 만들면 됩니다.

Account.Order.Product.(SKU & Price)

이제 구분 기호로 줄 바꿈 문자를 사용하여 하나의 큰 문자열로 결합하기만 하면 됩니다.

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

참고: CRM 제한 사항을 고려하세요. Zendesk Support 몇 가지 기본적인 서식을 제공하므로 \n 은(는) 답장 이메일에서 렌더링할 때 줄 바꿈으로 올바르게 변환되지만 모든 시스템에 해당되는 것은 아닙니다.

카드 및 회전 슬라이드

응답이 동일한 스키마를 따르는 한 기본적으로 데이터 쿼리 및 집계를 처리하므로 카드와 회전 슬라이드는 JSONata의 진정한 강점입니다. C&C는 각 개체가 카드 중 하나를 나타내는 개체 배열로 구성됩니다. 2개의 카드가 있는 C&C 구조의 아주 간단한 예는 다음과 같습니다.

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

중요한 것은 배열의 모든 개체가 동일한 구조를 따르므로 동일한 공유 키를 통해 액세스할 수 있다는 것입니다. 또한 CRM의 제한 사항을 염두에 두세요.

간단한 예를 들어 청구서 샘플 데이터에 다시 C&C를 구성해 보겠습니다. 처음부터 배열부터 시작하겠습니다. 두 개 이상의 응답 개체가 있는 모든 쿼리 결과는 자동으로 배열로 변환되지만 결과 자체가 하나의 개체만 전달하는 경우를 대비하여 이 안전 장치를 사용하는 것이 좋습니다. 

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

다음은 Zendesk가 관심을 가지고 있는 몇 가지 필드입니다. 이들을 하나의 개체로 결합하여 대상 개체의 각 키에 이름을 지정하세요.

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

더 높은 수준의 값이 필요한 경우에는 더 높은 수준의 쿼리를 시작하면 됩니다. [ 계정 . 을(를) 주문하세요 . 배열의 OrderID ]:

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

각 주문이 여러 항목을 포함할 수 있으므로 이 응답이 무작위로 보이는 문자열 배열을 만드는 이유는 더 이상 직접적인 1:1 일치가 없다는 것을 알 수 있습니다. 간접적으로 상위 개체에 액세스하거나(상위 바인딩 참조), JSONata에서 다른 개체 구조를 일시적으로 배정하거나(컨텍스트 변수 바인딩 참조), 선택한 순서대로 항목을 순환하는 보조 C&C를 추가하거나, 데이터를 추가로 변환하여 이 문제를 해결할 수 있습니다. 고객 경험을 제공할 수 있습니다. 다음은 예를 들어 변환된 예입니다.

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

쿼리를 더욱 철저히 검증하려면 예상 응답 데이터(예: 404를 포함)가 없는 경우를 대비하여 몇 가지 안전 장치를 추가하고, 응답이 CRM 에서 지원할 수 있는 것보다 더 많은 결과를 리턴하는 경우(예: 10 SunCo 위젯의 경우):

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

중요: 모든 C&C 키가 반드시 카멜 케이스 규칙을 따르도록 하세요. _ 매개변수 이름은 지원되지 않습니다.

이제 그러한 모든 키(예: orderId, name, totalPrice)를 회전 슬라이드에서 사용할 수 있습니다. UI에서 회전 슬라이드 유형을 동적으로 변경하고 위의 쿼리를 호스팅하는 매개변수 이름(예: orderList ) 을 추가합니다.

이제 % 약식을 추가하여 배열의 개체에 있는 모든 키에 액세스할 수 있습니다.

또는 선택한 매개변수 이름에 선택한 개체의 키를 참조하는 작업으로 선택한 카드를 채워 세션에 저장합니다. 예:

 

번역 고지 사항: 본 문서는 콘텐츠에 대한 기본적인 이해를 제공하기 위해 자동 번역 소프트웨어를 사용하여 번역되었습니다. 정확한 번역을 제공하고자 합당한 노력을 기울였으나 Zendesk는 번역의 정확성을 보장하지 않습니다.

번역된 문서에 포함된 정보의 정확성과 관련하여 질문이 있으시면 문서의 공식 버전인 영문 버전을 참조하시기 바랍니다.

Zendesk 제공