対話のための表現言語の方法
ユーザーの発話から抽出された値を処理し、コンテクスト変数、条件、または応答の他の部分で参照することができます。
式構文の使用場所
他の変数内の変数値を展開したり、出力テキストまたはコンテキスト変数にメソッドを適用したりするには、<? expression ?> 式構文を使用します。 以下に例を示します。
-
ダイアログ・ノードのテキスト応答からユーザー入力を参照する
You said <? input.text ?>. -
JSON エディターから数値プロパティーを増分する
"output":{"number":"<? output.number + 1 ?>"} -
ダイアログ・ノード条件の特定のエンティティー値を調べる
@city.toLowerCase() == 'paris' -
ダイアログ・ノード応答条件の特定の日付範囲を調べる
@sys-date.after(today()) -
コンテキスト・エディターからコンテキスト変数の配列に要素を追加する
| コンテキスト変数名 | コンテキスト変数値 |
|---|---|
toppings |
<? context.toppings.append( 'onions' ) ?> |
SpEL 式は、ダイアログ・ノード条件だけでなく、ダイアログ・ノード応答条件でも使用できます。
ノード条件で SpEL 式を使用する場合、周囲の <? ?> 構文は必要ありません。
以下のセクションでは、値を処理するために使用できる方法について説明します。 メソッドはデータ・タイプ別にまとめています。
配列
これらのメソッドを使用して、配列値を設定するその同じノード内のノード条件または応答条件に含まれる配列の値を調べることはできません。
JSONArray.addAll(JSONArray)
このメソッドは、1 つの配列を別の配列に追加します。
このダイアログ実行時のコンテキスト:
{
"context": {
"toppings_array": ["onion", "olives"],
"more_toppings": ["mushroom","pepperoni"]
}
}
適用する更新:
{
"context": {
"toppings_array": "<? $toppings_array.addAll($more_toppings) ?>"
}
}
結果: メソッド自体が nullを返します。 ただし、最初の配列は、2 番目の配列の値を含むように更新されます。
{
"context": {
"toppings_array": ["onion", "olives", "mushroom", "pepperoni"]
}
}
JSONArray.append(オブジェクト)
このメソッドは、JSONArray に新しい値を付加し、変更後の JSONArray を返します。
このダイアログ実行時のコンテキスト:
{
"context": {
"toppings_array": ["onion", "olives"]
}
}
適用する更新:
{
"context": {
"toppings_array": "<? $toppings_array.append('ketchup', 'tomatoes') ?>"
}
}
結果:
{
"context": {
"toppings_array": ["onion", "olives", "ketchup", "tomatoes"]
}
}
JSONArray.clear()
このメソッドは、配列のすべての値をクリアしてヌルを返します。
出力で以下の式を使用して、値のコンテキスト変数 ($toppings_array) に保存した配列をクリアするフィールドを定義します。
{
"output": {
"array_eraser": "<? $toppings_array.clear() ?>"
}
}
次に、$toppings_array コンテキスト変数を参照すると、' [] ' のみ返されます。
JSONArray.contains(オブジェクト値)
このメソッドは、入力 JSONArray に入力値が含まれていれば true を返します。
このダイアログの実行時コンテキストは、前のノードまたは外部アプリケーションによって設定されます
{
"context": {
"toppings_array": ["onion", "olives", "ham"]
}
}
ダイアログのノード条件または応答条件:
$toppings_array.contains('ham')
結果: true (配列にエレメント hamが含まれているため)。
JSONArray.containsIgnoreCase (オブジェクト値)
このメソッドは、値が大文字で指定されているか小文字で指定されているかに関係なく、入力 JSONArray に入力値が含まれている場合に true を返します。
このダイアログの実行時コンテキストは、前のノードまたは外部アプリケーションによって設定されます
{
"context": {
"toppings_array": ["onion", "olives", "ham"]
}
}
ダイアログのノード条件または応答条件:
$toppings_array.containsIgnoreCase('HAM')
結果: true。配列にエレメント ham が含まれており、大/小文字が無視されるためです。
JSONArray.containsIntent (ストリング intent_name、2 倍 min_score、[整数 top_n])
このメソッドは、指定のインテントが true JSONArray に特に含まれており、そのインテントの信頼度スコアが指定の最小スコア以上である場合に、intents を戻します。 オプションで数字を指定して、インテントが配列内のその数字の位までの最上位要素に含まれていなければならないことを指示することができます。 負の数値を指定すると、top_n パラメーターは無視されます。
指定のインテントが配列内にないか、信頼度スコアが最小スコア以上でないか、インテントの配列添字の位置が指定の添字位置より低い場合には、false を戻します。
このサービスは、ユーザー入力が送信されるたびに、入力内で検出したインテントをリストする intents 配列を自動生成します。 この配列は、サービスが検出したすべてのインテントを、信頼度の高い順にリストします。
ノード条件内でこのメソッドを使用することにより、インテントの存在を検査することに加えて、ノードを処理してその応答を返す前に満たしているべき信頼度スコアしきい値を設定することができます。
例えば、次の条件が満たされる場合のみダイアログ・ノードをトリガーするには、ノード条件内で以下の式を使用します。
#General_Endingインテントが存在する。#General_Endingインテントの信頼性スコアが 80% を超えています。#General_Endingインテントが、インテント配列内の最上位の 2 つのインテントの 1 つである。
intents.containsIntent("General_Ending", 0.8, 2)
JSONArray.filter(temp, "temp.property operator comparison_value")
各配列要素値と指定した値を比較して、配列をフィルタリングします。 このメソッドは、コレクション・プロジェクションと似ています。 コレクション・プロジェクションは、配列要素の名前と値のペアの名前に基づいて、フィルタリングされた配列を返します。 このフィルター・メソッドは、配列要素の名前と値のペアの値に基づいて、フィルタリングされた配列を戻します。
フィルター式の値は、以下のとおりです。
-
temp: 各配列要素が評価される際に一時的に使用される変数の名前。 例えば、cityです。 -
property:comparison_valueと比較する要素プロパティー。 このプロパティーは、1 つ目のパラメーターで指定した一時変数のプロパティーとして指定します。temp.propertyという構文を使用します。 例えば、latitudeが配列内の名前と値のペアのに対して有効な要素名であれば、city.latitudeとしてこのプロパティーを指定します。 -
operator: プロパティー値とcomparison_valueの比較に使用する演算子。サポートされている演算子は、以下のとおりです。
サポートされているフィルター演算子 オペレーター 説明 ==等しい >より大きい <より小さい >=次以上 <=次以下 !=等しくない -
comparison_value: 各配列要素プロパティー値の比較対象にする値。 ユーザー入力に応じて変化する可能性のある値を指定するには、コンテキスト変数かエンティティーを値として使用します。 変動する値を指定する場合は、comparison_valueの値が評価時に有効であることを保証するロジックを追加するか、エラーが発生するようにしてください。
フィルター例 1
例えば、市区町村の名前と人口数のセットが含まれる配列を評価し、人口が 500 万人を超える市区町村のみが含まれる小配列を戻すために、フィルター・メソッドを使用できます。
以下の $cities コンテキスト変数にはオブジェクトの配列が含まれています。 各オブジェクトには name と population のプロパティーが含まれています。
[
{
"name":"Tokyo",
"population":9273000
},
{
"name":"Rome",
"population":2868104
},
{
"name":"Beijing",
"population":20693000
},
{
"name":"Paris",
"population":2241346
}
]
以下の例では、任意の一時変数名は city です。 SpEL 式は $cities 配列をフィルタリングして、人口が 500 万人を超える市区町村のみを組み込みます。
$cities.filter("city", "city.population > 5000000")
この式は、以下のフィルタリング済みの配列を戻します。
[
{
"name":"Tokyo",
"population":9273000
},
{
"name":"Beijing",
"population":20693000
}
]
コレクション・プロジェクションを使用して、フィルタ・メソッドによって返される配列から都市名のみを含む新しい配列を作成することができます。 続いて join メソッドを使用して、配列の 2 つの名前要素値をストリングとして表示し、コンマとスペースで値を区切ることができます。
The cities with more than 5 million people include <? T(String).join(", ",($cities.filter("city", "city.population > 5000000")).![name]) ?>.
結果の応答: The cities with more than 5 million people include Tokyo, Beijing.
フィルター例 2
フィルタメソッドの利点は、 comparison_value の値をハードコードする必要がないことです。 この例では、ハードコードされた値5000000が、代わりにコンテキスト変数に置き換えられています。
この例では、$population_min コンテキスト変数に、数値 5000000 が含まれます。 任意の一時変数名は city です。 SpEL 式は $cities 配列をフィルタリングして、人口が 500 万人を超える市区町村のみを組み込みます。
$cities.filter("city", "city.population > $population_min")
この式は、以下のフィルタリング済みの配列を戻します。
[
{
"name":"Tokyo",
"population":9273000
},
{
"name":"Beijing",
"population":20693000
}
]
数値を比較する場合は、フィルター・メソッドをトリガーする前に、比較に関係するコンテキスト変数を有効な値に設定するようにしてください。 Null は、比較対象の配列エレメントに含まれている可能性がある場合は、有効な値にすることができます。 例えば、Tokyo の人口の名前と値のペアが "population":null で、比較式が "city.population == $population_min" の場合、null は $population_min コンテキスト変数の有効な値になります。
以下のようなダイアログ・ノード応答式を使用できます。
The cities with more than $population_min people include <? T(String).join(", ",($cities.filter("city", "city.population > $population_min")).![name]) ?>.
結果の応答: The cities with more than 5000000 people include Tokyo, Beijing.
フィルター例 3
この例では、エンティティー名を comparison_value として使用しています。 ユーザー入力は、 What is the population of Tokyo? です。 任意の一時変数名は y です。 Tokyo などの市区町村名を認識する @city という名前のエンティティーを作成しました。
$cities.filter("y", "y.name == @city")
この式は、以下の配列を戻します。
[
{
"name":"Tokyo",
"population":9273000
}
]
コレクション・プロジェクションを使用して、元の配列の人口要素のみを含んだ配列を取得してから、get メソッドを使用して人口要素の値を戻すことができます。
The population of @city is: <? ($cities.filter("y", "y.name == @city").![population]).get(0) ?>.
式が戻す結果: The population of Tokyo is 9273000.
JSONArray.get(整数)
このメソッドは、JSONArray から入力添字を返します。
このダイアログの実行時コンテキストは、前のノードまたは外部アプリケーションによって設定されます
{
"context": {
"name": "John",
"nested": {
"array": [ "one", "two" ]
}
}
}
ダイアログのノード条件または応答条件:
$nested.array.get(0).getAsString().contains('one')
結果:
True。ネストされた配列には、値として one が含まれているためです。
応答:
"output": {
"generic" : [
{
"values": [
{
"text" : "The first item in the array is <?$nested.array.get(0)?>"
}
],
"response_type": "text",
"selection_policy": "sequential"
}
]
}
JSONArray.getRandomItem()
このメソッドは、入力 JSONArray からランダム項目を返します。
このダイアログ実行時のコンテキスト:
{
"context": {
"toppings_array": ["onion", "olives", "ham"]
}
}
ダイアログ・ノード出力:
{
"output": {
"generic" : [
{
"values": [
{
"text": "<? $toppings_array.getRandomItem() ?> is a great choice!"
}
],
"response_type": "text",
"selection_policy": "sequential"
}
]
}
}
結果: "ham is a great choice!" または "onion is a great choice!" または "olives is a great choice!"
結果の出力テキストはランダムに選択されます。
JSONArray.indexOf(value)
このメソッドは、パラメーターとして指定した値と一致する配列内要素の添字番号を返します。配列内にその値が見つからない場合は -1 を返します。 値は、文字列( "School" )、整数( 8 )、またはダブル( 9.1 )です。値は完全に一致する必要があり、大文字と小文字が区別されます。
例として、以下のコンテキスト変数には配列が含まれています。
{
"context": {
"array1": ["Mary","Lamb","School"],
"array2": [8,9,10],
"array3": [8.1,9.1,10.1]
}
}
以下の式を使用して、指定されている値がある位置の配列添字を判別できます。
<? $array1.indexOf("Mary") ?> returns `0`
<? $array2.indexOf(9) ?> returns `1`
<? $array3.indexOf(10.1) ?> returns `2`
このメソッドは、例えばインテント配列内の要素の添字を取得する際などに役立つ場合があります。 ユーザー入力が評価されるたびに生成されるインテントの配列に indexOf メソッドを適用して、特定のインテントの配列添字番号を判別できます。
intents.indexOf("General_Greetings")
特定のインテントの信頼性スコアを知りたい場合は、前の式を*index値としてintents[index*].confidenceという構文の式に渡すことができます。 以下に例を示します。
intents[intents.indexOf("General_Greetings")].confidence
JSONArray.join(ストリング区切り文字)
このメソッドは、この配列内のすべての値をストリングに結合します。 値は文字列に変換され、入力区切り文字で区切られます。
このダイアログ実行時のコンテキスト:
{
"context": {
"toppings_array": ["onion", "olives", "ham"]
}
}
ダイアログ・ノード出力:
{
"output": {
"generic" : [
{
"values": [
{
"text": "This is the array: <? $toppings_array.join(';') ?>"
}
],
"response_type": "text",
"selection_policy": "sequential"
}
]
}
}
結果:
This is the array: onion;olives;ham;
ユーザー入力に複数のトッピングが言及されている場合、 @toppings という名前のトッピングの言及を認識できるエンティティを定義している場合、言及されたトッピングをリストアップするために、応答で次の式を使用することができます
So, you'd like <? @toppings.values.join(',') ?>.
複数の値を JSON 配列に格納する変数を定義すると、その配列から値のサブセットを返すことができます。 適切にフォーマット設定するには、 join() メソッドを使用します。
コレクション・プロジェクション
SpEL の collection projection 式は、オブジェクトが含まれている配列からサブコレクションを抽出します。 コレクション・プロジェクションの構文は array_that_contains_value_sets.![value_of_interest] です。
例として、以下のコンテキスト変数は、フライト情報を保管する JSON 配列を定義しています。 各フライトには、時刻とフライト・コードという 2 つのデータ・ポイントがあります。
"flights_found": [
{
"time": "10:00",
"flight_code": "OK123"
},
{
"time": "12:30",
"flight_code": "LH421"
},
{
"time": "16:15",
"flight_code": "TS4156"
}
]
フライト・コードのみを戻すには、以下の構文を使用してコレクション・プロジェクション式を作成できます。
<? $flights_found.![flight_code] ?>
この式は、flight_code 値の配列を ["OK123","LH421","TS4156"] として戻します。 詳細は Spring Expression Language(SpEL)のドキュメント を参照してください。
返された配列内の値に join() メソッドを適用すると、コンマ区切りリストでフライト・コードが表示されます。 例えば、応答内で次の構文を使用できます。
The flights that fit your criteria are:
<? T(String).join(",", $flights_found.![flight_code]) ?>.
結果: The flights that match your criteria are: OK123,LH421,TS4156.
JSONArray.joinToArray(template, retainDataType)
このメソッドは、配列内の各項目から情報を抽出し、指定したテンプレートに従ってフォーマットされた新しい配列を作成します。 テンプレートは、ストリング、JSON オブジェクト、または配列にすることができます。 このメソッドは、テンプレートのタイプに応じて、ストリングの配列、オブジェクトの配列、または配列の配列を返します。
このメソッドは、ダイアログ・ノードの出力の一部として返すことができるストリングとして情報をフォーマット設定する場合や、外部 API で使用できるようにデータを別の構造に変換する場合に役立ちます。
テンプレートでは、以下の構文を使用して、ソース配列の値を参照できます。ここで、 {property} は、ソース配列内のプロパティーの名前を表します。
%e.{property}%
例えば、アシスタントが、フライトの詳細を含む配列をコンテキスト変数に格納するとします。 保管されるデータは、以下のようになります。
"flights": [
{
"flight": "AZ1040",
"origin": "JFK",
"carrier": "Alitalia",
"duration": 485,
"destination": "FCO",
"arrival_date": "2019-02-03",
"arrival_time": "07:00",
"departure_date": "2019-02-02",
"departure_time": "16:45"
},
{
"flight": "DL1710",
"origin": "JFK",
"carrier": "Delta",
"duration": 379,
"destination": "LAX",
"arrival_date": "2019-02-02",
"arrival_time": "10:19",
"departure_date": "2019-02-02",
"departure_time": "07:00"
},
{
"flight": "VS4379",
"origin": "BOS",
"carrier": "Virgin Atlantic",
"duration": 385,
"destination": "LHR",
"arrival_date": "2019-02-03",
"arrival_time": "09:05",
"departure_date": "2019-02-02",
"departure_time": "21:40"
}
]
これらのフライトをユーザーが理解できる形式で記述するストリングの配列を作成するには、以下の式を使用します。
${Flight_data}.joinToArray("Flight %e.flight% to %e.destination%", true)
この式は、ストリングの配列 ["Flight AZ1040 to FCO","Flight DL1710 to LAX","Flight VS4379 to LHR"] を返します。
オプションの retainDataType パラメーターは、返される配列内のすべての入力値のデータ・タイプをメソッドで保持するかどうかを指定します。 retainDataType が false に設定されているか、省略されている場合、状況によっては、入力配列内のストリングが、返される配列内の数値に変換されることがあります。 例えば、入力配列から選択された値が "1"、
"2"、および "3" の場合、返される配列は [ 1, 2, 3 ] のようになります。 予期しない型変換を回避するには、このパラメーターに true を指定します。
複雑なテンプレート
より複雑なテンプレートには、読みやすいレイアウトで情報を表示するフォーマットが含まれている場合があります。 複合テンプレートの場合は、テンプレートをコンテキスト変数に保管することができます。これにより、ストリングの代わりに joinToArray メソッドに渡すことができます。
例えば、この複合テンプレートには、ラベルと書式設定を追加する配列要素のサブセットが含まれています。
<br/>Flight number: %e.flight% <br/> Airline: %e.carrier% <br/> Departure date: %e.departure_date% <br/> Departure time: %e.departure_time% <br/> Arrival time: %e.arrival_time% <br/>
テンプレートで使用するフォーマット設定が、アシスタント出力を表示するチャネル統合でサポートされていることを確認してください。
Template というコンテキスト変数を作成し、このテンプレートをその値として割り当てると、その変数を式で使用できます。
${Flight_data}.joinToArray(${Template})
実行時には、応答は次のようになります
Flight number: AZ1040
Airline: Alitalia
Departure date: 2019-02-02
Departure time: 16:45
Arrival time: 07:00
Flight number: DL1710
Airline: Delta
Departure date: 2019-02-02
Departure time: 07:00
Arrival time: 10:19
Flight number: VS4379
Airline: Virgin Atlantic
Departure date: 2019-02-02
Departure time: 21:40
Arrival time: 09:05
JSON オブジェクト・テンプレート
ストリングの代わりに、テンプレートを JSON オブジェクトとして定義できます。 これにより、さまざまなシステムからの情報のフォーマット設定を標準化したり、外部サービスに必要なフォーマットにデータを変換したりすることができます。
この例では、 Flight data コンテキスト変数に保管されている配列に指定されているエレメントからフライトの詳細を抽出する JSON オブジェクトとしてテンプレートが定義されています。
{
"departure": "Flight %e.flight% departs on %e.departure_date% at %e.departure_time%.",
"arrival": "Flight %e.flight% arrives on %e.arrival_date% at %e.arrival_time%."
}
このテンプレートを使用すると、 joinToArray() メソッドは、指定された構造を持つオブジェクトの新しい配列を返します。
JSONArray.remove(整数)
このメソッドは、JSONArray から添字位置のエレメントを削除し、更新後の JSONArray を返します。
このダイアログ実行時のコンテキスト:
{
"context": {
"toppings_array": ["onion", "olives"]
}
}
適用する更新:
{
"context": {
"toppings_array": "<? $toppings_array.remove(0) ?>"
}
}
結果:
{
"context": {
"toppings_array": ["olives"]
}
}
JSONArray.removeValue(object)
このメソッドは、JSONArray に最初に現れる値を削除し、更新後の JSONArray を返します。
このダイアログ実行時のコンテキスト:
{
"context": {
"toppings_array": ["onion", "olives"]
}
}
適用する更新:
{
"context": {
"toppings_array": "<? $toppings_array.removeValue('onion') ?>"
}
}
結果:
{
"context": {
"toppings_array": ["olives"]
}
}
JSONArray.set(添字整数, オブジェクト値)
このメソッドは、JSONArray の入力添字を入力値に設定し、変更後の JSONArray を返します。
このダイアログ実行時のコンテキスト:
{
"context": {
"toppings_array": ["onion", "olives", "ham"]
}
}
ダイアログ・ノード出力:
{
"context": {
"toppings_array": "<? $toppings_array.set(1,'ketchup')?>"
}
}
結果:
{
"context": {
"toppings_array": ["onion", "ketchup", "ham"]
}
}
JSONArray.size()
このメソッドは、JSONArray 配列のサイズを整数として返します。
このダイアログ実行時のコンテキスト:
{
"context": {
"toppings_array": ["onion", "olives"]
}
}
適用する更新:
{
"context": {
"toppings_array_size": "<? $toppings_array.size() ?>"
}
}
結果:
{
"context": {
"toppings_array_size": 2
}
}
JSONArray split(正規表現ストリング)
このメソッドは、入力正規表現を使用して、入力ストリングを分割します。 結果はストリングの JSONArray です。
入力:
"bananas;apples;pears"
構文:
{
"context": {
"array": "<?input.text.split(";")?>
}
}
結果の出力:
{
"context": {
"array": [ "bananas", "apples", "pears" ]
}
}
com.google.gson.JsonArray のサポート
組み込みメソッドに加えて、com.google.gson.JsonArray クラスの標準メソッドを使用できます。
新規配列
new JsonArray().append('value')
ユーザーが提供する値で埋められた新しい配列を定義するには、配列をインスタンス化します。 また、インスタンス化するときにはプレースホルダー値を配列に追加する必要もあります。 そのためには、以下の構文を使用します。
{
"context":{
"answer": "<? output.answer?:new JsonArray().append('temp_value') ?>"
}
日時
いくつかのメソッドは、日時の処理に使用できます。
ユーザー入力から日時情報を認識して抽出する方法については、@sys-date および @sys-time エンティティーを参照してください。
メソッドが呼び出される可能性のある日時リテラルでは、以下のストリング・フォーマットがサポートされます。
- 時刻の場合のみ:
HH:mm:ssまたはHH:mm - 日付の場合のみ:
yyyy-MM-dd - 日時の場合:
yyyy-MM-dd HH:mm:ss - タイム・ゾーン付きの日時の場合:
yyyy-MM-dd HH:mm:ss VV。 V記号は DateTimeFormatterのもので、IANAタイムゾーンデータベース(TZDB)形式のタイムゾーンを表す。
.after(日付または時刻ストリング)
日付/時刻値が日付/時刻引数より後かどうかを判別します。
.before(日付または時刻ストリング)
日付/時刻値が日付/時刻引数より前かどうかを判別します。
以下に例を示します。
-
@sys-time.before('12:00:00')
-
@sys-date.before('2016-11-21')
-
time vs. date、date vs. time、time vs. date and timeなど、異なる項目を比較すると、このメソッドは false を返し、例外が応答の JSON ログoutput.log_messagesに表示されます。例えば、
@sys-date.before(@sys-time)です。 -
date and time vs. timeを比較すると、この方法では日付を無視して、時間のみを比較します。
now(String time zone)
yyyy-MM-dd HH:mm:ss 形式の現在の日付と時刻を含むストリングを返します。 オプションで、timezone値を指定して、特定のタイム・ゾーンの現在の日時を取得します。返されるストリングの形式はyyyy-MM-dd HH:mm:ss 'GMT'XXXです。
- 静的関数。
- この関数から返される日時値で他の日付/時刻メソッドを呼び出して、それらのメソッドの引数として渡すことができます。
- ユーザーインターフェースが自動的に
$timezoneコンテキスト変数を作成するので、「試してみる」パネルからテストを実行すると、正しい時刻が返されます。 ユーザーがタイム・ゾーンを渡さなかった場合に、UI で自動的に設定されるタイム・ゾーンが使用されます。 UI の外部では、GMTがタイム・ゾーンとして使用されます。 タイムゾーンを指定するための構文については 、「システムエンティティでサポートされているタイムゾーン 」を参照してください。
now() を使用して、アシスタントが朝であるかどうかを最初に確認してから、朝固有の挨拶で応答する例を示します。
{
"conditions": "now().before('12:00:00')",
"output": {
"generic": [
{
"values": [
{
"text": "Good morning!"
}
],
"response_type": "text",
"selection_policy": "sequential"
}
]
}
}
タイムゾーンとともにnow()を使用して、現在の時刻(英国時間)を返す例:
{
"output": {
"generic": [
{
"values": [
{
"text": "The current date and time is: <? now('Europe/London') ?>"
}
],
"response_type": "text",
"selection_policy": "sequential"
}
]
}
}
ハードコードされたタイムゾーンの値をコンテキスト変数に置き換えることで、式に渡されたタイムゾーンに基づいて時間を動的に変更することができます。 例: <? now('$myzone') ?> $myzone のコンテキスト変数には、ある会話では 'Australia/Sydney' が設定され、別の会話では 'Mexico/BajaNorte' が設定される可能性があります。
.reformatDateTime(形式ストリング)
ユーザー出力用に希望するフォーマットに日付と時刻の文字列をフォーマットします。
指定された次の形式に従ってフォーマット設定されたストリングを返します。
MM/dd/yyyy(12/31/2016 とする場合)h a(10pm とする場合)
曜日を返すには次を指定します。
EEEE(火曜日)E(Tue 用)u(曜日指標とする場合) (1 = 月曜日、...、7 = 日曜日)
例えば、次のコンテキスト変数定義の場合は、値 17:30:00 を 5:30 PM として保存する $time 変数が作成されます。
{
"context": {
"time": "<? @sys-time.reformatDateTime('h:mm a') ?>"
}
}
書式は Javaの SimpleDateFormat 規則に従います。
注 :時刻のみをフォーマットしようとすると、日付は 1970-01-01 として扱われます。
.sameMoment(日付/時刻ストリング)
- 日付/時刻値が日付/時刻引数と同じかどうかを判別します。
.sameOrAfter(日付/時刻ストリング)
- 日付/時刻値が日付/時刻引数以降かどうかを判別します。
.after()に似ています。
.sameOrBefore(日付/時刻ストリング)
- 日付/時刻値が日付/時刻引数以前かどうかを判別します。
today()
yyyy-MM-dd 形式の現在の日付を含むストリングを返します。
- 静的関数。
- この関数から返される日付値に対して他の日付メソッドを呼び出して、それらのメソッドの引数として渡すことができます。
- コンテキスト変数
$timezoneが設定されている場合、この関数はクライアントのタイム・ゾーンでの日付を返します。 設定されていない場合は、GMTのタイム・ゾーンを使用します。
出力フィールドで today() が使用されるダイアログ・ノードの例:
{
"conditions": "#what_day_is_it",
"output": {
"generic": [
{
"values": [
{
"text": "Today's date is <? today() ?>."
}
],
"response_type": "text",
"selection_policy": "sequential"
}
]
}
}
結果: Today's date is 2018-03-09.
日時の計算
日付を計算するには、以下のメソッドを使用します。ここで、 <date> は yyyy-MM-dd または yyyy-MM-dd HH:mm:ss の形式で指定します。
| メソッド | 説明 |
|---|---|
<date>.minusDays(n) |
指定した日付より n 日前の日付を戻します。 |
<date>.minusMonths(n) |
指定した日付より n カ月前の日付を戻します。 |
<date>.minusYears(n) |
指定した日付より n 年前の日付を戻します。 |
<date>.plusDays(n) |
指定した日付より n 日後の日付を戻します。 |
<date>.plusMonths(n) |
指定した日付より n カ月後の日付を戻します。 |
<date>.plusYears(n) |
指定した日付より n 年後の日付を戻します。 |
明日の日付を取得するには、以下の式を指定します。
{
"output": {
"generic": [
{
"values": [
{
"text": "Tomorrow's date is <? today().plusDays(1) ?>."
}
],
"response_type": "text",
"selection_policy": "sequential"
}
]
}
}
今日が 2018 年 3 月 9 日である場合の結果: Tomorrow's date is 2018-03-10.
今日から 1 週間後の日付を取得するには、以下の式を指定します。
{
"output": {
"generic": [
{
"values": [
{
"text": "Next week's date is <? @sys-date.plusDays(7) ?>."
}
],
"response_type": "text",
"selection_policy": "sequential"
}
]
}
}
@sys-date エンティティーに取り込まれた日付が今日の日付 (2018 年 3 月 9 日) である場合の結果: Next week's date is 2018-03-16.
1 カ月前の日付を取得するには、以下の式を指定します。
{
"output": {
"generic": [
{
"values": [
{
"text": "Last month the date was <? today().minusMonths(1) ?>."
}
],
"response_type": "text",
"selection_policy": "sequential"
}
]
}
}
今日が 2018 年 3 月 9 日である場合の結果: Last month the date was 2018-02-9.
時刻を計算するには、以下のメソッドを使用します。ここで、 <time> は HH:mm:ss の形式で指定します。
| メソッド | 説明 |
|---|---|
<time>.minusHours(n) |
指定した時刻より n 時間前の時刻を戻します。 |
<time>.minusMinutes(n) |
指定した時刻より n 分前の時刻を戻します。 |
<time>.minusSeconds(n) |
指定した時刻より n 秒前の時刻を戻します。 |
<time>.plusHours(n) |
指定した時刻より n 時間後の時刻を戻します。 |
<time>.plusMinutes(n) |
指定した時刻より n 分後の時刻を戻します。 |
<time>.plusSeconds(n) |
指定した時刻から n 秒後の時刻を返します。 |
現時点から 1 時間後の時刻を取得するには、以下の式を指定します。
{
"output": {
"generic": [
{
"values": [
{
"text": "One hour from now is <? now().plusHours(1) ?>."
}
],
"response_type": "text",
"selection_policy": "sequential"
}
]
}
}
現在が午前 8 時である場合の結果: One hour from now is 09:00:00.
30 分前の時刻を取得するには、以下の式を指定します。
{
"output": {
"generic": [
{
"values": [
{
"text": "A half hour before @sys-time is <? @sys-time.minusMinutes(30) ?>."
}
],
"response_type": "text",
"selection_policy": "sequential"
}
]
}
}
@sys-time エンティティーに取り込まれた時刻が午前 8 時である場合の結果: A half hour before 08:00:00 is 07:30:00.
返された時刻を再フォーマットするには、以下の式を使用できます。
{
"output": {
"generic": [
{
"values": [
{
"text": "6 hours ago was <? now().minusHours(6).reformatDateTime('h:mm a') ?>."
}
],
"response_type": "text",
"selection_policy": "sequential"
}
]
}
}
現在が午後 2 時 19 分である場合の結果: 6 hours ago was 8:19 AM.
期間の処理
今日の日付が特定の時間枠内に入っているかどうかに基づいて応答を表示するには、時刻関連のメソッドを組み合わせて使用できます。 例えば、毎年休暇シーズン中に特価提供を実施する場合は、今日の日付が今年の 11 月 25 日から 12 月 24 日の間に入っているかどうか調べることができます。 最初に、対象の日付をコンテキスト変数として定義します。
以下の開始日と終了日のコンテキスト変数式では、導出された現在の年値とハードコードされた月および日値を結合することで日付が構築されています。
"context": {
"end_date": "<? now().reformatDateTime('Y') + '-12-24' ?>",
"start_date": "<? now().reformatDateTime('Y') + '-11-25' ?>"
}
応答条件で、コンテキスト変数として定義した開始日と終了日の間に現在の日付が入っている場合のみ応答が表示されるように指示できます。
now().after($start_date) && now().before($end_date)
java.util.Date のサポート
組み込みメソッドに加えて、java.util.Date クラスの標準メソッドを使用できます。
今日から 1 週間後の日付を取得するには、次の構文を使用します。
{
"context": {
"week_from_today": "<? new Date(new Date().getTime() +
(7 * (24*60*60*1000L))) ?>"
}
}
この式は、まず協定世界時1970年1月1日00:00:00からの経過ミリ秒数として現在の日付を取得します。 また、7 日間のミリ秒数も計算します ((24*60*60*1000L) は、1 日をミリ秒で表しています)。 次に、現在日付に 7 日を加えます。 結果は、今日から 1 週間後の日を示す完全な日付です。 例えば、Fri Jan 26 16:30:37 UTC 2018 です。 時刻は協定世界時のタイム・ゾーンです。
いつでも、この 7 を、値を渡せる変数 ($number_of_days など) に変更できます。 この式が評価される前に、その値が設定されていることを確認してください。
サービスによって生成された別の日付と比較できるようにしたい場合は、日付を再フォーマットする必要があります。 システム・エンティティー (@sys-date) および別の組み込みメソッド (now()) は、日付を yyyy-MM-dd 形式に変換します。
{
"context": {
"week_from_today": "<? new Date(new Date().getTime() +
(7 * (24*60*60*1000L))).format('yyyy-MM-dd') ?>"
}
}
日付を再フォーマットすると、結果は 2018-01-26 となります。 現在では、応答条件で @sys-date.after($week_from_today) のような表現を使用して、ユーザー入力で指定された日付とコンテキスト変数に保存された日付を比較することができます。
次の式は、今から 3 時間後の時間を計算します。
{
"context": {
"future_time": "<? new Date(new Date().getTime() + (3 * (60*60*1000L)) -
(5 * (60*60*1000L))).format('h:mm a') ?>"
}
}
(60*60*1000L) の値は、1 時間をミリ秒で表しています。 この式は、現在時刻に 3 時間を加算しています。 その後、協定世界時から東部標準時への時差を5時間減算して再計算します。 また、時間と分、および AM/PM を含むように日付値の形式を再設定します。
数値
これらのメソッドを使用して、数値を取得し、形式を再設定できます。
ユーザー入力から数値を認識して抽出するシステム・エンティティーについては、@sys-number エンティティーを参照してください。
ユーザー入力内の特定の数値形式 (注文番号参照など) をサービスで認識したい場合は、それをキャプチャーするためのパターン・エンティティーを作成することを検討してください。 詳しくは、エンティティーの作成を参照してください。
数字の小数部の桁数を変更する場合 (例えば、数字を通貨値として再フォーマットする場合) は、String format() メソッドを参照してください。
toDouble()
オブジェクトまたはフィールドを Double 数値型に変換します。 任意のオブジェクトまたはフィールドに対してこのメソッドを呼び出すことができます。 変換に失敗した場合は、null が返されます。
toInt()
オブジェクトまたはフィールドを Integer 数値型に変換します。 任意のオブジェクトまたはフィールドに対してこのメソッドを呼び出すことができます。 変換に失敗した場合は、null が返されます。
toLong()
オブジェクトまたはフィールドを Long 数値型に変換します。 任意のオブジェクトまたはフィールドに対してこのメソッドを呼び出すことができます。 変換に失敗した場合は、null が返されます。
SpEL 式で Long 数値型を指定する場合は、Long 数値型であることを示す L を数値の末尾に付加する必要があります 例えば、5000000000L です。 32 ビットの整数型に収まらない数値には、この構文が必須です。 例えば、2^31(2,147,483,648)より大きく、 -2 (-2 より小さい数値は、Long number typeとみなされます。 Long 数値型の最小値は -2^63、最大値は 2^63-1
(または 9,223,372,036,854,775,807) です。
数字が長すぎて認識できないかどうかを判断する必要がある場合は、次のような式を使用して、その数字に18以上の整数があるかどうかを確認します
<? @sys-number.toString().length() > 18 ?>
18個の整数より長い数値を処理する必要がある場合は、 @sys-number を使用する代わりに、パターンエンティティ( \d{20} のような正規表現を使用)を使用して処理することを検討してください。
標準的な数式
SpEL 式を使用して、標準的な数式を定義できます。数式では演算子を以下の記号で表します。
| 算術演算 | 記号 |
|---|---|
| 加算 |
|
| 除算 | / |
| 乗算 |
|
| 減算 |
|
例えば、ダイアログノードの応答で、ユーザー入力で指定された数値を捕捉するコンテキスト変数を追加し( @sys-number )、 $your_number として保存することができます。 その後、テキスト応答として以下のテキストを追加できます。
I'm doing math. Given the value you specified ($your_number), when I add 5, I get: <? $your_number + 5 ?>.
When I subtract 5, I get: <? $your_number - 5 ?>.
When I multiply it by 5, I get: <? $your_number * 5 ?>.
When I divide it by 5, I get: <? $your_number/5 ?>.
ユーザーが 10 を指定すると、次のようなテキスト応答が生成されます。
I'm doing math. Given the value you specified (10), when I add 5, I get: 15.
When I subtract 5, I get: 5.
When I multiply it by 5, I get: 50.
When I divide it by 5, I get: 2.
Java 数値のサポート
java.lang.Math()
基本的な数値演算を実行します。
以下のクラス・メソッドを使用できます。
max()
{
"context": {
"bigger_number": "<? T(Math).max($number1,$number2) ?>"
},
"output": {
"generic": [
{
"values": [
{
"text": "The bigger number is $bigger_number."
}
],
"response_type": "text",
"selection_policy": "sequential"
}
]
}
}
min()
{
"context": {
"smaller_number": "<? T(Math).min($number1,$number2) ?>"
},
"output": {
"generic": [
{
"values": [
{
"text": "The smaller number is $smaller_number."
}
],
"response_type": "text",
"selection_policy": "sequential"
}
]
}
}
pow()
{
"context": {
"power_of_two": "<? T(Math).pow($base.toDouble(),2.toDouble()) ?>"
},
"output": {
"generic": [
{
"values": [
{
"text": "Your number $base to the second power is $power_of_two."
}
],
"response_type": "text",
"selection_policy": "sequential"
}
]
}
}
詳しくは、 java.lang.Math リファレンス資料を参照してください。
java.util.Random()
乱数を返します。 以下のいずれかの構文オプションを使用できます。
- ランダム・ブール値 (true または false) を返すには、
<?new Random().nextBoolean()?>を使用します。 - 0(含む)から1(含まない)までの間のランダムなダブル数値を返すには、
<?new Random().nextDouble()?>を使用します。 - 0 (含まれる) から指定した数値までのランダムな整数を返すには、
<?new Random().nextInt(n)?>を使用します。ここで、n は目的の数値範囲の上限 + 1 です。 例えば、0 から 10 までの乱数を返す場合は、<?new Random().nextInt(11)?>と指定します。 - 整数値の範囲全体 (-2147483648 から 2147483648) からランダムな整数を返すには、
<?new Random().nextInt()?>を使用します。
例えば、#random_number インテントでトリガーされるダイアログ・ノードを作成することもできます。 この場合、最初の応答条件は、例えば次のようになります。
Condition = @sys-number
{
"context": {
"answer": "<? new Random().nextInt(@sys-number.numeric_value + 1) ?>"
},
"output": {
"generic": [
{
"values": [
{
"text": "Here's a random number between 0 and @sys-number.literal: $answer."
}
],
"response_type": "text",
"selection_policy": "sequential"
}
]
}
}
その他のメソッドに関する情報は java.util.Random のリファレンス・ドキュメントをご覧ください。
以下のクラスの標準メソッドも使用できます。
java.lang.Bytejava.lang.Integerjava.lang.Longjava.lang.Doublejava.lang.Shortjava.lang.Float
オブジェクト
JSONObject.clear()
このメソッドは、JSON オブジェクトのすべての値をクリアしてヌルを返します。
例えば、次の $user コンテキスト変数の現行値をクリアしたいとします。
{
"context": {
"user": {
"first_name":"John",
"last_name":"Snow"
}
}
}
出力で以下の式を使用して、このオブジェクトの値をクリアするフィールドを定義します。
{
"output": {
"object_eraser": "<? $user.clear() ?>"
}
}
$user コンテキスト変数を参照すると、 {} のみが返されます。
clear() メソッドは、API context 呼び出しの本文の output JSON オブジェクトか /message JSON オブジェクトで使用できます。
コンテキストのクリア
clear() メソッドを使用して context オブジェクトをクリアする際には、以下を除くすべての変数がクリアされます。
context.conversation_idcontext.timezonecontext.system
警告: すべてのコンテキスト変数値とは、以下のものを指します。
- 現在のセッション中にトリガーされたノードの変数に設定されたすべてのデフォルト値。
- 現在のセッション中にユーザーまたは外部サービスから提供された情報によって、デフォルト値に変更が加えられた場合。
このメソッドを使用する場合は、出力オブジェクトで定義する変数内の式の中でこのメソッドを指定できます。 以下に例を示します。
{
"output": {
"generic": [
{
"values": [
{
"text": "Response for this node."
}
],
"response_type": "text",
"selection_policy": "sequential"
}
],
"context_eraser": "<? context.clear() ?>"
}
}
出力のクリア
clear() メソッドを使用して output オブジェクトをクリアする際には、出力オブジェクトをクリアするために使用する変数と現行ノード内で定義しているテキスト応答を除き、すべての変数がクリアされます。 以下の変数もクリアされません。
output.nodes_visitedoutput.nodes_visited_details
このメソッドを使用する場合は、出力オブジェクトで定義する変数内の式の中でこのメソッドを指定できます。 以下に例を示します。
{
"output": {
"generic": [
{
"values": [
{
"text": "Have a great day!"
}
],
"response_type": "text",
"selection_policy": "sequential"
}
],
"output_eraser": "<? output.clear() ?>"
}
}
ツリーの前のノードで「I'm happy to help.」というテキスト応答を定義してから、上記の定義の JSON 出力オブジェクトが含まれているノードにジャンプした場合は、「Have a great day.」のみが応答として表示されます。 I'm happy to help. の出力は表示されません。これは、 clear() メソッドを呼び出しているノードからのテキスト応答で置き換えられ、クリアされるためです。
JSONObject.has(ストリング)
このメソッドは、複合 JSONObject に入力名のプロパティーがあれば true を返します。
このダイアログ実行時のコンテキスト:
{
"context": {
"user": {
"first_name": "John",
"last_name": "Snow"
}
}
}
ダイアログ・ノード出力:
{
"conditions": "$user.has('first_name')"
}
結果: 条件は true です。user オブジェクトにプロパティー first_name が含まれています。
JSONObject.remove(ストリング)
このメソッドは、入力 JSONObject から名前のプロパティーを削除します。 このメソッドから返される JSONElement が、削除される JSONElement です。
このダイアログ実行時のコンテキスト:
{
"context": {
"user": {
"first_name": "John",
"last_name": "Snow"
}
}
}
ダイアログ・ノード出力:
{
"context": {
"attribute_removed": "<? $user.remove('first_name') ?>"
}
}
結果:
{
"context": {
"user": {
"last_name": "Snow"
},
"attribute_removed": {
"first_name": "John"
}
}
}
com.google.gson.JsonObject のサポート
組み込みメソッドに加えて、com.google.gson.JsonObject クラスの標準メソッドの一部もサポートされています。
ストリング
これらのメソッドは、テキストの処理を支援します。
ユーザー入力から特定のタイプの文字列 (人名や場所など) を認識して抽出する方法については、システム・エンティティーを参照してください。
注: 正規表現を使用するメソッドについては、正規表現を指定する際に使用する構文の詳細については RE2を参照してください。
String.append(オブジェクト)
このメソッドは、ストリングに入力オブジェクトをストリングとして付加し、変更後のストリングを返します。
このダイアログ実行時のコンテキスト:
{
"context": {
"my_text": "This is a text."
}
}
構文:
{
"context": {
"my_text": "<? $my_text.append(' More text.') ?>"
}
}
結果の出力:
{
"context": {
"my_text": "This is a text. More text."
}
}
String.contains(ストリング)
このメソッドは、ストリングに入力サブストリングが含まれていれば true を返します。
入力: Yes, I'd like to go.
構文:
{
"conditions": "input.text.contains('Yes')"
}
結果: 条件は true です。
String.endsWith(String)
このメソッドは、ストリングが入力サブストリングで終わっていれば true を返します。
入力:
"What is your name?".
構文:
{
"conditions": "input.text.endsWith('?')"
}
結果: 条件は true です。
String.equals (ストリング)
このメソッドは、指定されたストリングが入力ストリングと正確に等しい場合に true を返します。
入力: 「Yes」
構文:
{
"conditions": "input.text.equals('Yes')"
}
結果: 条件は true です。
入力が Yes.の場合、結果は false になります。これは、ユーザーがピリオドを組み込み、式は句読点のない正確なテキスト Yes のみを予期しているためです。
String.equalsIgnoreCase(String)
このメソッドは、指定された文字列が入力文字列と一致する場合、大文字と小文字の区別に関係なく、 true を返します。
入力: 「Yes」
構文:
{
"conditions": "input.text.equalsIgnoreCase('Yes')"
}
結果: 条件は true です。
入力が Yes. の場合、結果は false となります。なぜなら、ユーザーはピリオドを含めたため、式はピリオドを含まない、大文字または小文字の Yes というテキストのみを期待しているからです。
String.extract(正規表現ストリング, グループ添字整数)
このメソッドは、指定した正規表現グループ・パターンに一致する入力ストリングを返します。 一致が見つからない場合は、空ストリングを返します。
このメソッドは、単一の正規表現パターンに対する複数の異なる一致ではなく、複数の異なる正規表現パターン・グループに対する一致を抽出するように設計されています。 複数の異なる一致を見つけるには、getMatch メソッドを参照してください。
この例では、コンテキスト変数に、指定した正規表現パターン・グループに一致するストリングが保存されます。 この式では、2 つの正規表現パターン・グループをそれぞれ括弧で囲んで定義しています。 3 番目の固有グループは、2 つのグループで構成されます。 これは最初の groupIndex 正規表現グループです。これは、数字グループとテキストグループの両方を含む文字列に一致します。 2 番目の正規表現グループ (groupIndex 1) は、数値グループの最初のオカレンスと一致します。 3 番目のグループ (groupIndex 2) は、数値グループの後の最初のテキスト・グループのオカレンスと一致します。
{
"context": {
"number_extract": "<? input.text.extract('([\\d]+)(\\b [A-Za-z]+)',n) ?>"
}
}
JSON で正規表現を指定する場合は、2 つのバックスラッシュ (\) を指定する必要があります。ノード応答でこの式を指定する場合、必要なバックスラッシュは 1 つだけです。 以下に例を示します。
<? input.text.extract('([\d]+)(\b [A-Za-z]+)',n) ?>
入力:
"Hello 123 this is 456".
結果:
- n=
0の場合、値は123 thisです。 - n=
1の場合、値は123です。 - n=
2の場合、値はthisです。
String.find(正規表現ストリング)
このメソッドは、ストリングのいずれかのセグメントが入力正規表現と一致すれば true を返します。 このメソッドは、JSONArrayまたはJSONObject要素に対して呼び出すことができ、比較を行う前に配列またはオブジェクトを文字列に変換します。
入力:
"Hello 123456".
構文:
{
"conditions": "input.text.find('^[^\d]*[\d]{6}[^\d]*$')"
}
結果: 条件は true です。入力テキストの数値部分が正規表現 ^[^\d]*[\d]{6}[^\d]*$ と一致します。
String.getMatch(正規表現ストリング, matchIndex 整数)
このメソッドは、指定した正規表現パターンのオカレンスに一致する入力ストリングを返します。 一致が見つからない場合、このメソッドは空ストリングを返します。
検出された一致は、一致配列のようなものに追加されます。 配列要素のカウントは 0 から始まるので、3 番目の一致を返すには、matchIndex 値として 2 を指定します。 例えば、指定したパターンと一致する単語が 3 つ含まれているテキスト・ストリングを入力した場合は、その添字の値を指定するだけで 1 番目の一致、2 番目の一致、または 3 番目の一致を返せます。
次の式では、入力内の数値のグループを探しています。 この式では、添字値 1 を指定しているので、2 番目のパターン一致ストリングが $second_number コンテキスト変数に保存されます。
{
"context": {
"second_number": "<? input.text.getMatch('([\\d]+)',1) ?>"
}
}
JSON 構文で式を指定する場合は、2 つのバックスラッシュ (\) を指定する必要があります。ノード応答で式を指定する場合、必要なバックスラッシュは 1 つだけです。
以下に例を示します。
<? input.text.getMatch('([\d]+)',1) ?>
-
ユーザー入力:
"hello 123 i said 456 and 8910". -
結果:
456
この例では、式は入力の3番目のテキストブロックを探します。
<? input.text.getMatch('(\b [A-Za-z]+)',2) ?>
同じユーザー入力の場合、この式は and を返します。
String.isEmpty()
このメソッドは、ストリングが空ストリングであるがヌル以外の場合に true を返します。
このダイアログ実行時のコンテキスト:
{
"context": {
"my_text_variable": ""
}
}
構文:
{
"conditions": "$my_text_variable.isEmpty()"
}
結果: 条件は true です。
String.length()
このメソッドは、ストリングの文字長を返します。
入力:
"Hello"
構文:
{
"context": {
"input_length": "<? input.text.length() ?>"
}
}
結果の出力:
{
"context": {
"input_length": 5
}
}
String.matches(正規表現ストリング)
このメソッドは、ストリングが入力正規表現と一致すれば true を返します。
入力:
"Hello".
構文:
{
"conditions": "input.text.matches('^Hello$')"
}
結果: 条件は true です。入力テキストが正規表現 \^Hello\$ と一致します。
String.startsWith(String)
このメソッドは、ストリングが入力サブストリングで始まっていれば true を返します。
入力:
"What is your name?".
構文:
{
"conditions": "input.text.startsWith('What')"
}
結果: 条件は true です。
String.substring(Integer beginIndex, Integer endIndex)
このメソッドは、 beginIndex の文字から最後の文字までを抜き出し、 endIndex の前にインデックスを設定します。 endIndex の位置の文字は含まれません。
このダイアログ実行時のコンテキスト:
{
"context": {
"my_text": "This is a text."
}
}
構文:
{
"context": {
"my_text": "<? $my_text.substring(5, $my_text.length()) ?>"
}
}
結果の出力:
{
"context": {
"my_text": "is a text."
}
}
String.toJson()
このメソッドは、JSON データを含むストリングを解析し、次の例のように JSON オブジェクトまたは配列を返します。
${json_var}.toJson()
コンテキスト変数 ${json_var} に以下のストリングが含まれているとします。
"{ \"firstname\": \"John\", \"lastname\": \"Doe\" }"
toJson() メソッドは、以下のオブジェクトを返します。
{
"firstname": "John",
"lastname": "Doe"
}
String.toLowerCase()
このメソッドは、小文字に変換された元の文字列を返します。
入力:
"This is A DOG!"
構文:
{
"context": {
"input_lower_case": "<? input.text.toLowerCase() ?>"
}
}
結果の出力:
{
"context": {
"input_lower_case": "this is a dog!"
}
}
String.toUpperCase()
このメソッドは、大文字に変換された元の文字列を返します。
入力:
"hi there".
構文:
{
"context": {
"input_upper_case": "<? input.text.toUpperCase() ?>"
}
}
結果の出力:
{
"context": {
"input_upper_case": "HI THERE"
}
}
String.trim()
このメソッドは、ストリングの先頭と末尾にスペースがあればそれを切り取り、変更後のストリングを返します。
このダイアログ実行時のコンテキスト:
{
"context": {
"my_text": " something is here "
}
}
構文:
{
"context": {
"my_text": "<? $my_text.trim() ?>"
}
}
結果の出力:
{
"context": {
"my_text": "something is here"
}
}
java.lang.String のサポート
組み込みメソッドに加えて、java.lang.String クラスの標準メソッドを使用できます。
java.lang.String.format()
標準の Java String format() メソッドをテキストに適用できます。 フォーマットの詳細を指定する際に使用する構文については java.util.formatterファレンスを参照してください。
例えば、次の式は 3 つの 10 進整数 (1、1、および 2) を受け取り、それらを文に追加します。
{
"formatted String": "<? T(java.lang.String).format('%d + %d equals %d', 1, 1, 2) ?>"
}
結果: 1 + 1 equals 2
数字の小数部の桁数を変更するには、以下の構文を使用します。
{
<? T(String).format('%.2f',<number to format>) ?>
}
例えば、米ドルでフォーマットする必要がある $number という変数が 4.5 である場合、 Your total is $<? T(String).format('%.2f',$number) ?> のような応答は Your total is $4.50. を返します。
間接的なデータ型変換
例えば、ノード応答の一部として式をテキスト内に組み込むと、その値は文字列としてレンダリングされます。 式を元のデータ・タイプでレンダリングする場合は、式をテキストで囲まないでください。
例えば、次の式をダイアログ・ノードの応答に追加すると、ユーザー入力で認識されたエンティティーを文字列形式で返すことができます。
The entities are <? entities ?>.
ユーザーが入力として Hello now を指定した場合、now 参照によって @sys-date エンティティーと @sys-time エンティティーがトリガーされます。 entities オブジェクトは配列ですが、式がテキスト内に組み込まれているため、エンティティーは次のように文字列形式で返されます。
The entities are 2018-02-02, 14:34:56.
応答にテキストを指定しない場合は、代わりに配列が返されます。 例えば、テキストで囲まずに式だけを応答として指定します。
<? entities ?>
エンティティ情報は、元のデータ型で配列として返されます。
[
{
"entity":"sys-date","location":[6,9],"value":"2018-02-02","confidence":1,"metadata":{"calendar_type":"GREGORIAN","timezone":"America/New_York"}
},
{
"entity":"sys-time","location":[6,9],"value":"14:33:22","confidence":1,"metadata":{"calendar_type":"GREGORIAN","timezone":"America/New_York"}
}
]
別の例として、次の $array コンテキスト変数は配列ですが、$string_array コンテキスト変数は文字列です。
{
"context": {
"array": [
"one",
"two"
],
"array_in_string": "this is my array: $array"
}
}
「試してみる」パネルでこれらのコンテキスト変数の値を確認すると、以下のように指定された値が表示されます
$array : ["one","two"]
$array_in_string : "this is my array: [\"one\",\"two\"]"
$array 変数に対しては、 <? $array.removeValue('two') ?> のような配列メソッドを実行できますが、$array_in_string 変数に対しては実行できません。