

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 示例：在 Step Functions 工作流中操作带路径的状态数据
<a name="input-output-example"></a>

**管理状态和转换数据**  
了解如何[使用变量在状态之间传递数据](workflow-variables.md)和[使用 JSONata 转换数据](transforming-data.md)。

本主题包含有关如何使用 InputPath、ResultPath 和 OutputPath 字段来操作状态输入和输出 JSON 的示例。

除 [Fail 工作流程状态](state-fail.md) 或 [Succeed 工作流程状态](state-succeed.md) 状态外的任何状态，都可以包含输入和输出处理字段，如 `InputPath`、`ResultPath` 或 `OutputPath`。此外，[Wait 工作流程状态](state-wait.md) 和 [Choice 工作流程状态](state-choice.md) 状态不支持 `ResultPath` 字段。通过这些字段，您可以使用 [JsonPath](https://datatracker.ietf.org/wg/jsonpath/about/) 来筛选在工作流中移动的 JSON 数据。

您还可以使用 `Parameters` 字段在 JSON 数据在工作流中移动时对其进行操作。有关使用 `Parameters` 的信息，请参阅 [在 Step Functions 工作流中操作参数](input-output-inputpath-params.md)。

例如，从AWS Lambda教程中所述的 [创建使用 Lambda 的 Step Functions 状态机](tutorial-creating-lambda-state-machine.md) 函数和状态机开始。修改状态机，以便它包含以下 `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` 节点（包括 `lambdaresult` 插入的 `ResultPath` 子节点）。状态输出将筛选为以下内容。

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

在该 `Task` 状态中：

1. `InputPath` 仅将输入中的 `lambda` 节点发送至 Lambda 函数。

1. `ResultPath` 将结果作为 `data` 节点的子级插入原始输入。

1. `OutputPath` 将筛选状态输入（现在包含 Lambda 函数的结果），以便它仅将 `data` 节点传递到状态输出。

**Example 使用 JsonPath 操作原始状态机输入、结果和最终输出**  
考虑以下状态机器，它可以验证保险申请人的身份和地址。  
要查看完整的示例，请参阅 [How to use JSON Path in Step Functions](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` 确定）传递到下一个状态。