

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

# Amazon States Language 中用于 Step Functions 工作流程的状态机结构
<a name="statemachine-structure"></a>

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

状态机使用 JSON 文本定义，该文本表示的结构包含以下字段。

** `Comment`（可选）**  
一个人类可读格式的状态机描述。

** `QueryLanguage`（可选；省略时，默认为 `JSONPath`）**  
+ 状态机使用的查询语言名称。支持的值包括 `JSONPath` 和 `JSONata`。
+ 如果未为状态机提供，则每个状态的默认值为 JSONPath。
+ 当顶级状态机查询语言为时 `JSONPath`，各个状态可以通过将 QueryLanguage 设置为 `JSONata` 来覆盖查询语言。通过这种方法，您可以逐步将状态机从 JSONPath 转换为 JSONata，一次转换一个状态。
+ **注意：**您无法将基于 JSONata 的顶级状态机恢复为 JSONata 和 JSONPath 状态的组合状态。

** `StartAt`（必填）**  
一个字符串，必须与某个状态对象的名称完全匹配（区分大小写）。

** `TimeoutSeconds`（可选）。**  
状态机执行可运行的最大秒数。如果运行时间超过指定时间，则执行失败并返回 `States.Timeout` [错误名称](concepts-error-handling.md#error-handling-error-representation)。

** `Version`（可选）**  
状态机中使用的 Amazon States Language 版本（默认为“1.0”）。

** `States`（必填）**  
一个对象，其中包含逗号分隔的状态集合。

`States` 字段包含[状态](workflow-states.md)。

```
{
    "State1" : {
    },

    "State2" : {
    },
    ...
}
```

状态机由其包含的状态以及状态之间的关系所定义。

示例如下：

```
{
  "Comment": "A Hello World example of the Amazon States Language using a Pass state",
  "StartAt": "HelloWorld",
  "States": {
    "HelloWorld": {
      "Type": "Pass",
      "Result": "Hello World!",
      "End": true
    }
  }
}
```

启动此状态机的执行时，系统从 `StartAt` 字段中引用的状态开始 (`"HelloWorld"`)。如果此状态有一个 `"End": true` 字段，则执行停止并返回结果。否则，系统会查找 `"Next":` 字段并使用下一个状态继续。此过程不断重复，直至系统达到最终状态 (`"Type": "Succeed"`、`"Type": "Fail"` 或 `"End": true` 状态) 或者出现运行时错误。

以下规则适用于状态机中的状态：
+ 状态在封闭块中可以按任意顺序出现，但它们列出的顺序不会影响到它们的运行顺序。运行顺序由状态的内容决定。
+ 在状态机中，只能有一个状态指定为 `start` 状态，由顶级结构中 `StartAt` 字段的值指定。此状态是在执行启动时首先执行的状态。
+ `End` 字段为 `true` 的任意状态将被视为 `end`（或 `terminal`）状态。根据状态机逻辑（例如状态机有多个执行分支），您可能会有多个 `end` 状态。
+ 如果状态机只包含一个状态，该状态可以为 `start` 状态和 `end` 状态。

## 工作流程中的常用状态字段
<a name="amazon-states-language-common-fields"></a>

以下字段对所有状态元素是通用的。

** `Type`（必填）**  
状态的类型：Task、Choice、Parallel、Map、Pass、Wait、Succeed、Fail。

**`QueryLanguage`（可选；省略时，默认为 `JSONPath`）**  
+ 状态使用的查询语言名称。支持的值包括 `JSONPath` 和 `JSONata`。
+ 当顶级状态机查询语言为时 `JSONPath`，各个状态可以通过将 QueryLanguage 设置为 `JSONata` 来覆盖查询语言。通过这种方法，您可以逐步将状态机从 JSONPath 转换为 JSONata，一次转换一个状态。

** `Next` **  
当前状态完成时将运行的下一个状态的名称。某些状态类型 (例如 `Choice`) 允许多个转换状态。  
如果当前状态是工作流中的最后一个状态或终端状态（例如 [Succeed 工作流程状态](state-succeed.md) 或 [Fail 工作流程状态](state-fail.md)），则无需指定 `Next` 字段。

** `End` **  
在设置为 `true` 时，指定此状态作为终端状态（结束执行）。每个状态机可以有任意数量的终端状态。在一个状态中只能使用一个 `Next` 或 `End`。某些状态类型（例如 `Choice`）或终端状态（例如 [Succeed 工作流程状态](state-succeed.md) 和 [Fail 工作流程状态](state-fail.md) ）不支持或使用 `End` 字段。

** `Comment`（可选）**  
保存状态的人类可读格式的描述。

** `Assign`（可选）**  
用于存储变量。`Assign` 字段接受一个带有键/值对的 JSON 对象，这些键/值对定义变量名及其分配的值。任何字符串值（包括对象或数组内的字符串），若被 `{% %}` 字符包裹，都会被解析为 JSONata 表达式。  
有关更多信息，请参阅 [使用变量在状态之间传递数据](workflow-variables.md)。

** `Output`（可选，仅限 JSONata）**  
用于指定和转换状态的输出。指定后，该值将覆盖状态输出默认值。  
输出字段接受任何 JSON 值（对象、数组、字符串、数字、布尔值、null）。任何字符串值（包括对象或数组内的字符串），若被 \$1% %\$1 字符包裹，都会被解析为 JSONata 表达式。  
 输出还直接接受 JSONata 表达式，例如："Output": "\$1% jsonata expression %\$1"  
有关更多信息，请参阅[输入和输出处理](concepts-input-output-filtering.md)。

** `InputPath`（可选，仅限 JSONPath）**  
一个[路径](concepts-input-output-filtering.md)，用于选择要传递到状态任务进行处理的状态输入的一部分。如果省略，它的值为 `$`，表示指定整个输入。有关更多信息，请参阅[输入和输出处理](concepts-input-output-filtering.md)。

** `OutputPath`（可选，仅限 JSONPath）**  
一个[路径](concepts-input-output-filtering.md)，用于选择要传递到下一个状态的状态输出的一部分。如果省略，它的值为 `$`，表示指定整个输出。有关更多信息，请参阅[输入和输出处理](concepts-input-output-filtering.md)。