

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 範例：使用 Step Functions 工作流程中的路徑處理狀態資料
<a name="input-output-example"></a>

**管理狀態和轉換資料**  
了解如何[使用變數在狀態與使用 JSONata 轉換資料之間傳遞資料](workflow-variables.md)。 [ JSONata](transforming-data.md)

本主題包含如何使用 InputPath、ResultPath 和 OutputPath 欄位來操作狀態輸入和輸出 JSON 的範例。

狀態[失敗的工作流程狀態](state-fail.md)或[工作流程狀態成功](state-succeed.md)狀態以外的任何狀態都可以包含輸入和輸出處理欄位，例如 `InputPath`、 `ResultPath`或 `OutputPath`。此外， [等待工作流程狀態](state-wait.md)和 [選擇工作流程狀態](state-choice.md) 狀態不支援 `ResultPath` 欄位。透過這些欄位，您可以使用 [JsonPath](https://datatracker.ietf.org/wg/jsonpath/about/) 來篩選在工作流程中移動的 JSON 資料。

您也可以使用 `Parameters` 欄位，在 JSON 資料在工作流程中移動時對其進行操作。如需使用 `Parameters` 的相關資訊，請參閱 [在 Step Functions 工作流程中操作參數](input-output-inputpath-params.md)。

例如，從[建立使用 Lambda 的 Step Functions 狀態機器](tutorial-creating-lambda-state-machine.md)教學中描述的 AWS Lambda 函數和狀態機器開始。修改狀態機器，使其包含下列 `InputPath`、`ResultPath` 及 `OutputPath`。

```
{
  "Comment": "A Hello World example of the Amazon States Language using an AWS Lambda function",
  "StartAt": "HelloWorld",
  "States": {
    "HelloWorld": {
      "Type": "Task",
      "Resource": "arn:aws:lambda:region:123456789012:function:HelloFunction",
      "InputPath": "$.lambda",
      "ResultPath": "$.data.lambdaresult",
      "OutputPath": "$.data",
      "End": true
    }
  }
}
```

使用以下輸入開始執行。

```
{
  "comment": "An input comment.",
  "data": {
    "val1": 23,
    "val2": 17
  },
  "extra": "foo",
  "lambda": {
    "who": "AWS Step Functions"
  }
}
```

假設可以捨棄 `comment`和 `extra`節點，但您想要包含 Lambda 函數的輸出，並保留`data`節點中的資訊。

在已更新的狀態機器中，`Task` 狀態會更改為處理任務輸入。

```
"InputPath": "$.lambda",
```

狀態機器定義中的這一行會將任務輸入限制為僅限任務輸入中的 `lambda` 節點。Lambda 函數只會接收 JSON 物件`{"who": "AWS Step Functions"}`做為輸入。

```
"ResultPath": "$.data.lambdaresult",
```

這會`ResultPath`告知狀態機器將 Lambda 函數的結果插入名為 的節點`lambdaresult`，做為原始狀態機器輸入中`data`節點的子項。由於您沒有使用 對原始輸入和結果執行任何其他操作`OutputPath`，因此狀態的輸出現在會包含 Lambda 函數的結果與原始輸入。

```
{
  "comment": "An input comment.",
  "data": {
    "val1": 23,
    "val2": 17,
    "lambdaresult": "Hello, AWS Step Functions!"
  },
  "extra": "foo",
  "lambda": {
    "who": "AWS Step Functions"
  }
}
```

但是，我們的目標是只保留`data`節點，並包含 Lambda 函數的結果。 會先`OutputPath`篩選此合併 JSON，再將其傳遞至狀態輸出。

```
"OutputPath": "$.data",
```

這只會選取原始輸入中要傳遞到輸出的 `data` 節點 (包括 `ResultPath` 所插入的 `lambdaresult` 子系)。狀態輸出會篩選到下列。

```
{
  "val1": 23,
  "val2": 17,
  "lambdaresult": "Hello, AWS Step Functions!"
}
```

在此 `Task` 狀態中：

1. `InputPath` 只會將`lambda`節點從輸入傳送至 Lambda 函數。

1. `ResultPath` 會插入結果做為原始輸入中 `data` 節點的子節點。

1. `OutputPath` 會篩選狀態輸入 （現在包含 Lambda 函數的結果），使其僅將`data`節點傳遞至狀態輸出。

**Example 使用 JsonPath 操作原始狀態機器輸入、結果和最終輸出**  
請考慮以下狀態機器，以驗證保險申請人的身分和地址。  
若要檢視完整範例，請參閱 [Step Functions 中的如何使用 JSON 路徑](https://github.com/aws-samples/serverless-account-signup-service)。

```
{
  "Comment": "Sample state machine to verify an applicant's ID and address",
  "StartAt": "Verify info",
  "States": {
    "Verify info": {
      "Type": "Parallel",
      "End": true,
      "Branches": [
        {
          "StartAt": "Verify identity",
          "States": {
            "Verify identity": {
              "Type": "Task",
              "Resource": "arn:aws:states:::lambda:invoke",
              "Parameters": {
                "Payload.$": "$",
                "FunctionName": "arn:aws:lambda:us-east-2:111122223333:function:check-identity:$LATEST"
              },
              "End": true
            }
          }
        },
        {
          "StartAt": "Verify address",
          "States": {
            "Verify address": {
              "Type": "Task",
              "Resource": "arn:aws:states:::lambda:invoke",
              "Parameters": {
                "Payload.$": "$",
                "FunctionName": "arn:aws:lambda:us-east-2:111122223333:function:check-address:$LATEST"
              },
              "End": true
            }
          }
        }
      ]
    }
  }
}
```
如果您使用以下輸入執行此狀態機器，則執行會失敗，因為執行驗證的 Lambda 函數只預期需要驗證為輸入的資料。因此，您必須指定包含要使用適當 JsonPath 驗證之資訊的節點。  

```
{
  "data": {
    "firstname": "Jane",
    "lastname": "Doe",
    "identity": {
      "email": "jdoe@example.com",
      "ssn": "123-45-6789"
    },
    "address": {
      "street": "123 Main St",
      "city": "Columbus",
      "state": "OH",
      "zip": "43219"
    },
    "interests": [
      {
        "category": "home",
        "type": "own",
        "yearBuilt": 2004
      },
      {
        "category": "boat",
        "type": "snowmobile",
        "yearBuilt": 2020
      },
      {
        "category": "auto",
        "type": "RV",
        "yearBuilt": 2015
      },
    ]
  }
}
```
若要指定 `check-identity` Lambda 函數必須使用的節點，請使用 `InputPath` 欄位，如下所示：  

```
"InputPath": "$.data.identity"
```
若要指定 `check-address` Lambda 函數必須使用的節點，請使用 `InputPath` 欄位，如下所示：  

```
"InputPath": "$.data.address"
```
現在，如果您想要將驗證結果存放在原始狀態機器輸入中，請使用 `ResultPath` 欄位，如下所示：  

```
"ResultPath": "$.results"
```
不過，如果您只需要身分和驗證結果並捨棄原始輸入，請使用 `OutputPath` 欄位，如下所示：  

```
"OutputPath": "$.results"
```

如需詳細資訊，請參閱[在 Step Functions 中處理輸入和輸出](concepts-input-output-filtering.md)。

## 使用 OutputPath 篩選狀態輸出
<a name="input-output-outputpath"></a>

使用 `OutputPath` ，您可以選取要傳遞至下一個狀態的部分狀態輸出。使用此方法，您可以篩選掉不需要的資訊，並只傳遞您需要的 JSON 部分。

如未指定 `OutputPath`，預設值將會是 `$`。這樣會將整個 JSON 節點 (由狀態輸入、任務結果及 `ResultPath` 決定) 傳遞至下一個狀態。