# Step Functions で JSONata がサポートされたので試してみる


published: 2024-11-30

シンプルに気になった。
JSONata には $min() や $max() など関数が用意されており便利そう。


## AWS公式ドキュメント

- [https://docs.aws.amazon.com/step-functions/latest/dg/transforming-data.html](https://docs.aws.amazon.com/step-functions/latest/dg/transforming-data.html)
- [AWS News](https://aws.amazon.com/jp/about-aws/whats-new/2024/11/aws-step-functions-variables-jsonata-transformations/)
## 大文字へ

{% %} の内側に JSONata の構文を書く。
$states.input に入力値がセットされており $uppercase() という関数で加工している。


- [https://docs.jsonata.org/string-functions#uppercase](https://docs.jsonata.org/string-functions#uppercase)
![uppercase.png](https://lab.enuesaa.dev/prototype/stepfunctions-jsonata-try/uppercase.png)

## 大文字へ (実行結果)

期待通り大文字になった


![uppercase-result.png](https://lab.enuesaa.dev/prototype/stepfunctions-jsonata-try/uppercase-result.png)

## 配列を集計・操作

入力として次のJSONを渡す。


```json
{
  "items": [2,1,2,3]
}

```

このとき $min() や $max() という関数で集計。 $sort() で並び替えて $distinct() で重複アイテムを取り除く。

- [https://docs.jsonata.org/aggregation-functions](https://docs.jsonata.org/aggregation-functions)
- [https://docs.jsonata.org/array-functions](https://docs.jsonata.org/array-functions)
![items.png](https://lab.enuesaa.dev/prototype/stepfunctions-jsonata-try/items.png)

## 配列を集計・操作 (実行結果)

期待通り

![items-result.png](https://lab.enuesaa.dev/prototype/stepfunctions-jsonata-try/items-result.png)

## コード

### `uppercase.asl.yml`

```yml
QueryLanguage: JSONata
Comment: uppercase
StartAt: Pass
States:
  Pass:
    Type: Pass
    End: true
    Output:
      title: '{% $states.input.title ~> $uppercase %}'

```

### `items.asl.yml`

```yml
QueryLanguage: JSONata
Comment: 配列のアイテムを集計・操作する
StartAt: Pass
States:
  Pass:
    Type: Pass
    End: true
    Output:
      min: '{% $states.input.items ~> $min %}'
      max: '{% $states.input.items ~> $max %}'
      sum: '{% $states.input.items ~> $sum %}'
      average: '{% $states.input.items ~> $average %}'
      count: '{% $states.input.items ~> $count %}'
      sort: '{% $states.input.items ~> $sort(?, function($a, $b) { $a < $b }) %}'
      distinct: '{% $states.input.items ~> $distinct %}'
      shuffle: '{% $states.input.items ~> $shuffle %}'

```

### memos

ASL (Amazon States Language) 形式です


- [ドキュメント](https://docs.aws.amazon.com/ja_jp/step-functions/latest/dg/concepts-amazon-states-language.html)
## リンク

- [AWS 公式ドキュメント](https://docs.aws.amazon.com/step-functions/latest/dg/transforming-data.html)
- [https://jsonata.org/](https://jsonata.org/)
## 感想

JSONata がサポートされたと聞いてシンプルに気になった。
いろいろ関数があるので、テキスト加工の選択肢として有りだと思う。


