APLデータソース
データソースとは、Alexa Presentation Language(APL)ドキュメントにバインドできるデータを定義するJSON構造のことです。RenderDocument
ディレクティブを使ってAPLドキュメントをAlexaに送信するときに、1つ以上のデータソースを含めることができます。APLドキュメントのパラメーターにデータソースを含めるとデータソースがバインドされます。その後で、データバインディング式を使用して、データをドキュメント内のコンポーネントプロパティにバインドできます。
RenderDocumentディレクティブでデータソースを送信する
任意のdatasources
オブジェクトでAlexaにデータソースを渡します。datasources
オブジェクトはRenderDocument
ディレクティブの一部ですが、APLドキュメントには含まれません。datasources
オブジェクトには、各データソースを表すオブジェクトが含まれています。
以下は、RenderDocument
ディレクティブを使用したスキル応答の例です。ドキュメントと「myDocumentData」という名前のデータソースがAlexaに渡されます。ドキュメントの内容は、簡潔に示すために省略しています。
{
"version": "1.0",
"response": {
"outputSpeech": {
"type": "SSML",
"ssml": "<speak>これは例です</speak>"
},
"sessionAttributes": {},
"directives": [
{
"type": "Alexa.Presentation.APL.RenderDocument",
"token": "[SkillProvidedToken]",
"document": {
"type": "APL",
"version": "1.6",
"mainTemplate": {
"parameters": [
"myDocumentData"
],
"items": []
}
},
"datasources": {
"myDocumentData": {
"title": "基本的なデータソース内のタイトルフィールド例"
}
}
}
]
}
}
データソースをドキュメントにバインドする
データバインディング式を使用して、データソースのデータをAPLドキュメントのコンポーネントプロパティにバインドします。
データソースのデータをドキュメントのコンポーネントプロパティにバインドする方法
- データソースオブジェクトのキーと一致するパラメーターを
mainTemplate.parameters
配列で宣言します。 - コンポーネントプロパティで、構文
${dataSourceName.propertyName}
を使用してデータソースプロパティを参照します。dataSourceName
はmainTemplate.parameters
で使用したキーと同じです。
たとえば、次のデータソースオブジェクトがあるとします。
{
"myDocumentData": {
"title": "基本的なデータソース内のタイトルフィールド例"
}
}
このデータソースのキーはmyDocumentData
です。mainTemplate.parameters
でパラメーターmyDocumentData
を宣言します。
{
"type": "APL",
"version": "1.6",
"mainTemplate": {
"parameters": [
"myDocumentData"
],
"items": []
}
}
次に、データバインディング式を使用して、コンポーネントプロパティをmyDocumentData
のデータにバインドします。プロパティにアクセスするには、myDocumentData
キーを使用します。たとえば、この式は「基本的なデータソース内のタイトルフィールド例」(${myDocumentData.title}
)という値に解決されます。
以下は、myDocumentData.title
プロパティのコンテンツをテキストコンポーネントに表示するAPLドキュメントの例です。
{
"type": "APL",
"version": "1.6",
"import": [
{
"name": "alexa-layouts",
"version": "1.3.0"
}
],
"mainTemplate": {
"parameters": [
"myDocumentData"
],
"items": [
{
"type": "Container",
"width": "100vw",
"height": "100vh",
"items": [
{
"type": "Text",
"text": "${myDocumentData.title}"
}
]
}
]
}
}
データソースをペイロードまたはその他のパラメータにバインドすることについて
1.3より前のバージョンのAPLでは、mainTemplate.parameters
のパラメーターとしてデータソースのキーを使用できませんでした。代わりに、パラメータを「payload」などの文字列に設定し、スキルの応答で提供されるdatasources
オブジェクト全体にマッピングしていました。次に、データバインディング式にこのパラメーターを含める必要がありました。たとえば、前述の例の場合、title
プロパティを取得する式は${payload.myDocumentData.title}
などです。
「payload」をmainTemplate.parameters
として使用するドキュメントは今後も引き続き機能します。ただし、新しいAPLドキュメントには簡略化したフォームを使用することをお勧めします。パラメーターとして他の文字列を使用しても機能しません。「payload」またはデータソースキーを使用する必要があります。
データソースの型
APLは、型指定ありと自由形式(型指定なし)のデータソースをサポートします。
- 自由形式(型指定なし) - 定義するプロパティの任意のセットを持つJSONオブジェクトです。前述の
myDocumentData
の例は、自由形式データソースの例です。 - 型指定あり - Alexa Skills Kitで定義された構造を持つJSONオブジェクトです。一部の機能では、型指定ありのデータソースを使用する必要があります。APLは、型指定ありの2つのデータソースをサポートします。
object
- トランスフォーマーを使用してデータを操作するために必要です。たとえば、SSMLテキストを音声に変換したり、デバイスに設定されているウェイクワードを含むヒントを作成したりする場合です。dynamicIndexList
- 遅延読み込みを使用して、ユーザーがスクロールするとデータを徐々に読み込む場合や、ドキュメントのレンダリング後にデータソースを変更する場合に必要です。dynamicTokenList
– トークンベースの遅延読み込みを使用して一度に1ページ分のデータを読み込む場合に必要です。
オブジェクトデータソース
object
データソースタイプは、トランスフォーマーに必要なプロパティを追加します。データを操作するにはトランスフォーマーを使用します。たとえば、トランスフォーマーを使用して、ユーザーのデバイスに設定されたウェイクワードをヒント文字列に挿入します。
object
データソースには、以下のプロパティがあります。
プロパティ | 型 | 必須 | 説明 |
---|---|---|---|
|
オブジェクト |
◯ |
「オブジェクト」である必要があります。 |
|
オブジェクト |
✕ |
トランスフォーマーで使用できるプロパティを含むオブジェクトです。トランスフォーマーは常に |
|
文字列 |
✕ |
オブジェクトデータソースの任意の識別子です。 |
|
文字列 |
✕ |
データソースの任意の説明です。 |
|
配列 |
✕ |
|
object
データソースには、必要に応じてドキュメントにバインドできる他の任意のプロパティを含めることもできます。
以下は、properties
オブジェクトと任意のプロパティ(hello
)の両方にデータを含むobject
データソースの例です。データソースには、textToSpeech
トランスフォーマーもあります。トランスフォーマーはproperties
オブジェクト内のデータを参照します。トランスフォーマーの詳しい使用方法については、トランスフォーマーを参照してください。
{
"myDocumentData": {
"type": "object",
"properties": {
"title": "これはとても単純な例です。",
"mainText": "これらのプロパティは<code>properties</code>オブジェクトにあります。"
},
"hello": "ハローワールド"
"transformers": [
{
"inputPath": "title",
"outputName": "titleSpeech",
"transformer": "textToSpeech"
}
]
}
}
動的なデータソース
APLは、2種類の動的なデータソースをサポートします。動的データソースでは、データソースをAlexaに送信した後で更新できるため、完全に新しいドキュメントを送信することなく画面上の値を変更できます。これらのデータソースでは遅延読み込みも利用できます。遅延読み込みでは、ユーザーがコンテンツをスクロールすると、Alexaが大きなリストを徐々に表示します。
動的なデータソースには、次の2種類があります。
dynamicIndexList
– インデックスを使って項目を追跡します。ユーザーはリストの任意の場所にスクロールできます。dynamicTokenList
– トークンを使って項目を追跡します。ユーザーは一度に1ページずつ前後にスクロールできます。
dynamicIndexListデータソース
dynamicIndexList
データソースは、遅延読み込みと動的データソースに必要なプロパティを追加します。
以下の表は、dynamicIndexList
データソースのプロパティです。
プロパティ | 型 | 必須 | 説明 |
---|---|---|---|
|
文字列 |
◯ |
|
|
文字列 |
◯ |
同じAPLドキュメント内のデータソースを区別するための識別子です。 |
|
整数 |
◯ |
items配列内の先頭アイテムのインデックスです。任意のオフセットでエクスペリエンスを開始するには、ゼロ以外の値を指定します。たとえば、「M」で始まる連絡先名のアルファベット順のリストを表示します。 |
|
整数 |
✕ |
配列の最初の項目のインデックスです(インデックスはこの値を含みます)。 |
|
整数 |
✕ |
配列の最後のインデックスです(インデックスはこの値を含みません)。設定されなかった場合、リストは正方向スクロールリストですが、配列の最後のインデックスが不明になります。このプロパティを項目の配列の最後のインデックス + 1 に明示的に設定すると、ユーザーが正方向にスクロールしたときにそれ以上項目を読み込まないリストになります。たとえば、200項目にわたる正方向スクロールエクスペリエンスを作成するには、 |
|
配列 |
✕ |
レンダリングする最初の項目のオブジェクトデータの配列です。表示する最初の要素は、 |
以下は、最初に10個の項目を表示するdynamicIndexList
データソースの例です。ユーザーが正方向にスクロールすると、200個の項目がすべて読み込まれるまで、Alexaはさらに項目を要求します。
{
"dynamicSourceExample": {
"type": "dynamicIndexList",
"listId": "my-list-id",
"startIndex": 0,
"minimumInclusiveIndex": 0,
"maximumExclusiveIndex": 200,
"items": [
{"primaryText":"item 1"},
{"primaryText":"item 2"},
{"primaryText":"item 3"},
{"primaryText":"item 4"},
{"primaryText":"item 5"},
{"primaryText":"item 6"},
{"primaryText":"item 7"},
{"primaryText":"item 8"},
{"primaryText":"item 9"},
{"primaryText":"item 10"}
]
}
}
dynamicIndexList
内の任意のプロパティをドキュメントにバインドすることはできません。dynamicIndexList
は、表示するリスト項目を提供する目的でのみ使用します。ドキュメントに他のデータをバインドするには別のデータソースを使用してください。dynamicTokenListデータソース
以下の表は、dynamicTokenList
データソースのプロパティです。
プロパティ | 型 | 必須 | 説明 |
---|---|---|---|
|
文字列 |
◯ |
|
|
文字列 |
◯ |
同じAPLドキュメント内のデータソースを区別するための識別子です。 |
|
文字列 |
◯ |
データソースに含まれる項目に関連付けられたトークンです。 |
|
文字列 |
✕ |
前のページの項目データを取得するトークンです。 指定されない場合、レンダリングできる前のリスト項目はありません。ユーザーはリストをスクロールして戻ることができません。 |
|
文字列 |
✕ |
次のページの項目データを取得するトークンです。 指定されない場合、レンダリングできる次のリスト項目はありません。ユーザーはリストをスクロールして進むことができません。 |
|
配列 |
✕ |
レンダリングする最初の項目のオブジェクトデータの配列です。Alexaは表示されているリスト領域の左上に先頭の項目を表示します。 |
動的なデータソースをAPLドキュメントにバインドします。
ドキュメントで動的なデータソースを使用するには、mainTemplate.parameter
でデータソースキーを使用する必要があります。1.3より前の「payload」パラメーターは使用しないでください。
次に、データバインディング式でデータソースキーを使用します。たとえば、dynamicSourceExample
というデータソースを作成するとします。このデータソースをバインドするには、${dynamicSourceExample}
式を使用します。この構文は、ドキュメントにitems
プロパティの項目のセットを提供します。式にitems
プロパティを含めないでください。
データソースをPager
、GridSequence
、Sequence
、Container
のdata
プロパティのいずれかにバインドします。Container
は遅延読み込みをサポートしていませんが、動的データソースはサポートしています。dynamicIndexList
をほかのコンポーネントタイプとともに使用することはできません。
以下は、dynamicSourceExample
データソースで定義されている10個の項目を表示するSequence
の例です。
{
"type": "APL",
"version": "1.6",
"mainTemplate": {
"parameters": [
"dynamicSourceExample"
],
"items": [
{
"type": "Sequence",
"data": "${dynamicSourceExample}",
"items": {
"type": "Text",
"text": "${data.primaryText}"
}
}
]
}
}
ディレクティブとリクエストを使用してリストを管理する
Alexa.Presentation.APLインターフェースは、動的なデータソースを管理する複数のディレクティブとリクエストを提供します。
dynamicIndexList
データソースを使用すると、項目を徐々に読み込むことができます。リストのコンテンツを変更することもできます。dynamicTokenList
使用すると、ユーザーのスクロールに応じてリストに追加のコンテンツページを読み込むことができます。
dynamicIndexListを使って項目を徐々に読み込む
RenderDocument
ディレクティブで項目の初期セットを含むdynamicIndexList
データソースを送信します。- ユーザーがリストをスクロールすると、Alexaはスキルに
LoadIndexListData
リクエストを送信して、表示する追加の項目を要求します。 LoadIndexListData
リクエストに、SendIndexListData
ディレクティブと次に表示する項目のセットを含む別のdynamicIndexList
データソースで応答します。
dynamicIndexListのコンテンツを変更する
RenderDocument
ディレクティブでリスト項目のセットを含む最初のdynamicIndexList
データソースを送信します。UpdateIndexListData
ディレクティブを使用して、新しい項目の挿入や既存の項目の削除などのデータ更新を行います。
dynamicTokenListを使ってデータのページを読み込む
RenderDocument
ディレクティブで項目の初期セットを含むdynamicTokenList
データソースを送信します。- ユーザーがリストをスクロールすると、Alexaはスキルに
LoadTokenListData
リクエストを送信して、表示する追加の項目を要求します。 LoadTokenListData
リクエストに、SendTokenListData
ディレクティブと次に表示する項目のセットを含む別のdynamicTokenList
データソースで応答します。
リクエストやディレクティブの詳細については、Alexa.Presentation.APLインターフェースのリファレンスを参照してください。
Sequenceコンポーネントのサイズと読み込む項目数
遅延読み込みでSequence
を含む動的なデータソースを使用する場合、各応答でSequence
を少なくとも3回満たすのに十分な項目を送信します。たとえば、Sequence
に5つの項目を表示できる高さがある場合、最初のdynamicIndexList
には15個以上の項目が含まれている必要があります。後続のSendIndexListData
、SendTokenListData
の各ディレクティブにも、15個以上の項目を含める必要があります。水平スクロールのSequence
にも同じことが当てはまります。Sequence
に5個の項目を表示できる幅がある場合は、各呼び出しで15個以上の項目を送信します。
十分な大きさの項目セットを提供することで、リストのパフォーマンスとユーザーエクスペリエンスが向上します。各応答で少ししか項目を送信しないと、ユーザーがスクロールするたびにAlexaが新しい項目を絶えずリクエストする必要があるため、ユーザーエクスペリエンスが悪くなる可能性があります。
項目の読み込みやスクロール時にSequence
の高さまたは幅が静的になるようにするには、Sequence
のheight
またはwidth
プロパティでauto
設定を使用しないようにします。 Sequence
のサイズを相対または絶対ディメンションのいずれかに設定します。
関連トピック
最終更新日: 2021 年 06 月 04 日