🫠

Step FunctionのJSON Pathで配列の最後のアイテムを取得する

2024/02/09に公開

TL;DR

次のJSON Pathで取得できる。

$.array[(@.length-1)]

概要

Step Functionでは入出力をJSONで受け渡すことができ、JSON Pathの構文を用いてデータのフィルタリングや加工を行うことができます。
厳密にはステートは状態を持っており、各ステートごとにフィルタリングや加工を行うことができます。この辺については公式の説明がわかりやすいため、ここでは割愛します。

配列の最後のアイテムを取得するには?

配列の最後のアイテムを取得する際には、次のようにNegative Offsetを指定すれば良いと考えていました。

$.array[-1]

JSON Pathのドキュメントにも記載されていますし、この挙動はワークフローシミュレーターでも確認することができます。

ワークフローシミュレーター

しかし、実際に上記の構文でワークフローを実行すると、次のエラーが発生します。

ワークフローの例
{
  "Comment": "Sample",
  "StartAt": "Sample",
  "States": {
    "Sample": {
      "Type": "Pass",
      "Parameters": {
        "hoge.$": "$.array[-1].name"
      },
      "End": true
    }
  }
}
実行時の入力
{
  "array": [
    {
      "name": "hoge"
    }
  ]
}
エラー文
"The JSONPath '$.array[-1].name' specified for the field 'hoge.$' could not be found in the input '{ "array": [ { "name": "Hoge" } ] }'"

詳細は分かりませんが、シミュレーターでは動作するのに、実際の実行で失敗するのはなんだか気持ち悪いですね。ちなみにIndexに0を指定した場合は正常に動作します。

途方に暮れていたところStack Overで見かけた方法を試し、無事に配列の最後の値を取得することができました。

{
  "Comment": "Sample",
  "StartAt": "Sample",
  "States": {
    "Sample": {
      "Type": "Pass",
      "Parameters": {
        "hoge.$": "$.array[(@.length-1)]"
      },
      "End": true
    }
  }
}

Discussion