AdaptiveCards.Templating でアダプティブ カードを生成する
はじめに
C# からアダプティブ カードを生成する方法は 2 種類あります。
- AdaptiveCards SDK (AdaptiveCards)
- AdaptiveCards Templating SDK (AdaptiveCards.Templating)
似たようなパッケージですが、機能的には大きく異なります。中でも影響があるのは内部で参照する JSON ライブラリです。AdaptiveCards SDK は Newtonsoft.Json を、AdaptiveCards Templating SDK は System.Text.Json を参照しています。最近では System.Text.Json を使用する場合が増えているため、AdaptiveCards Templating SDK を積極的に使うことをおすすめします。
サンプル コード
実行手順
基本的な流れ
AdaptiveCards Templating SDK ではテンプレート化されたアダプティブ カード JSON を読み込み、データをバインドします。バインドする値は ${変数名} という形式で宣言します。$root、$data、$index といった予約済みのキーワードも使用できます。
{
"type": "AdaptiveCard",
"$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
"version": "1.6",
"body": [
{
"type": "TextBlock",
"text": "${title}",
"wrap": true,
"style": "heading"
},
{
"type": "FactSet",
"facts": [
{
"title": "Name",
"value": "${customer[0].firstName} ${customer[0].lastName}"
},
{
"title": "Phone number",
"value": "${customer[0].phone}"
}
]
},
...
]
}
バインドするデータは JSON 文字列またはオブジェクトを指定します。
var template = new AdaptiveCardTemplate(File.ReadAllText("Template.json"));
var data = new
{
Title = "Please confirm your order:",
Customer = new[]
{
new
{
FirstName = "John",
LastName = "Smith",
Phone = "(555) 555-5555"
}
}
};
var card = template.expand(data);
Console.WriteLine(card);
動的に表示する内容を制御する
$when を使うことで、要素の表示の有無を制御できます。たとえば、先のテンプレートで電話番号が入力されていなければ非表示にするには、次のようにします。
{
"type": "AdaptiveCard",
"$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
"version": "1.6",
"body": [
{
"type": "TextBlock",
"text": "${title}",
"wrap": true,
"style": "heading"
},
{
"type": "FactSet",
"facts": [
{
"title": "Name",
"value": "${customer[0].firstName} ${customer[0].lastName}"
},
{
"title": "Phone number",
"value": "${customer[0].phone}"
+ "$when": "${length(customer[0].phone) > 0}"
}
]
},
...
]
}
アダプティブ カードでは以下の演算子が使用できます。
今回は length 関数を使っていますが、そのほかにも組み込みの関数があります。
null の扱い
バインドされる値が null の場合、変換されずに式そのままが出力されます。これを防ぐには、空文字列など null 以外の値を設定することを強制するか、テンプレート式で対応する必要があります。
{
"type": "AdaptiveCard",
"$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
"version": "1.6",
"body": [
{
"type": "TextBlock",
- "text": "${title}",
+ "text": "${if(empty(title), 'No title', title)}",
"wrap": true,
"style": "heading"
},
{
"type": "FactSet",
"facts": [
{
"title": "Name",
"value": "${customer[0].firstName} ${customer[0].lastName}"
},
{
"title": "Phone number",
"value": "${customer[0].phone}"
}
]
},
...
]
}
おわりに
テンプレートは Power Automate からアダプティブ カードを作成する場合でも利用できるため、ぜひ活用してください。
Discussion