

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

# 在 Step Functions 中从上下文对象访问执行数据
<a name="input-output-contextobject"></a>

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

上下文对象是执行期间可用的内部 JSON 结构，包含有关状态机和执行的信息。上下文可为您的工作流提供有关其特定执行的信息。您的工作流程可以使用在 JSONata 表达式中引用 Context 对象`$states.context`。

## 访问上下文对象
<a name="contextobject-access"></a>

**要访问中的上下文对象 JSONata**

要在 JSONata 状态下访问 Context 对象，请在 JSONata 表达式`$states.context`中使用。

```
{
  "ExecutionID" : "{% $states.context.Execution.Id %}"
}
```

**要访问中的上下文对象 JSONPath**

要访问中的 Context 对象 JSONPath，首先`.$`要在键的末尾追加以指示该值是路径。然后，在值前加上 `$$.` 以选择上下文对象中的节点。

```
{
  "ExecutionID.$": "$$.Execution.Id"
}
```

JSONPath 状态可以从以下 JSONPath字段中引用上下文 (`$$.`)：
+ `InputPath`
+ `OutputPath`
+ `ItemsPath`（在 Map 状态下）
+ `Variable`（在 Choice 状态下）
+ `ResultSelector`
+ `Parameters`
+ 变量到变量的比较运算符

## 上下文对象字段
<a name="contextobject-format"></a>

上下文对象包括有关状态机、状态、执行和任务的信息。该上下文 JSON 对象包括每种类型数据的节点，并采用以下格式：

```
{
    "Execution": {
        "Id": "String",
        "Input": {},
        "Name": "String",
        "RoleArn": "String",
        "StartTime": "Format: ISO 8601",
        "RedriveCount": Number,
        "RedriveTime": "Format: ISO 8601"
    },
    "State": {
        "EnteredTime": "Format: ISO 8601",
        "Name": "String",
        "RetryCount": Number
    },
    "StateMachine": {
        "Id": "String",
        "Name": "String"
    },
    "Task": {
        "Token": "String"
    }
}
```

在执行期间，上下文对象将以相关数据填充。

有时，上下文中会添加新字段。如果您要直接处理 JSON 上下文，建议您编写能够妥善处理新的未知字段的代码。例如，如果使用 Jackson 库对 JSON 进行解组，建议在您的 `ObjectMapper` 中将 `FAIL_ON_UNKNOWN_PROPERTIES` 设置为 `false` 以防止 `UnrecognizedPropertyException`。

 `RedriveTime` 上下文对象只有在您已redriven执行时才可用。如果您已[redriven a Map Run](redrive-map-run.md)，则 `RedriveTime` 上下文对象仅适用于标准类型的子工作流。对于使用快速类型的子工作流的redriven Map Run，`RedriveTime` 不可用。

来自正在运行的执行的内容包括以下格式的具体信息：

```
{
    "Execution": {
        "Id": "arn:aws:states:region:123456789012:execution:stateMachineName:executionName",
        "Input": {
           "key": "value"
        },
        "Name": "executionName",
        "RoleArn": "arn:aws:iam::123456789012:role...",
        "StartTime": "2025-08-27T10:04:42Z"
    },
    "State": {
        "EnteredTime": "2025-08-27T10:04:42.001Z",
        "Name": "Test",
        "RetryCount": 3
    },
    "StateMachine": {
        "Id": "arn:aws:states:region:123456789012:stateMachine:stateMachineName",
        "Name": "stateMachineName"
    },
    "Task": {
        "Token": "h7XRiCdLtd/83p1E0dMccoxlzFhglsdkzpK9mBVKZsp7d9yrT1W"
    }
}
```

**具有小数秒精度的时间戳格式**  
Step Functions 遵循 ISO8601 规范，即根据需要，输出可以是零、三、六或九位数字。当时间戳的小数秒部分为零时，Step Functions 会移除末尾的零，而不会对输出进行补零填充。  
如果您创建的代码使用 Step Functions 时间戳，则您的代码必须能够处理可变数量的小数秒。

## Map 状态的上下文对象数据
<a name="contextobject-map"></a>

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

处理 [`Map` 状态](state-map.md)时，上下文还将包含 `Index`、`Value` 和 `Source`。

对于每个`Map`状态迭代，`Index`包含当前正在处理的数组项的索引号，`Value`包含正在处理的数组项，`Source`并将是`CSV``JSON`、`JSONL`、或`PARQUET`。 InputType 

在 `Map` 状态内，上下文对象包括以下数据：

```
"Map": {
   "Item": {
      "Index" : Number,
      "Key"   : "String", // Only valid for JSON objects
      "Value" : "String",
      "Source": "String"
   }
}
```

这些项仅在 `Map` 状态下可用，并且可以在 `ItemSelector（Map）` 字段中指定。

**注意**  
您必须在主要 `ItemSelector` 状态的 `Map` 块中的上下文对象中定义参数，而不是在 `ItemProcessor` 部分中包含的状态中定义参数。

给定一个使用状态的**JSONPath**`Map`状态机，你可以按如下方式从 Context 对象中注入信息。

```
{
  "StartAt": "ExampleMapState",
  "States": {
    "ExampleMapState": {
      "Type": "Map",
      "ItemSelector": {
        "ContextIndex.$": "$$.Map.Item.Index",
        "ContextValue.$": "$$.Map.Item.Value",
        "ContextSource.$": "$$.Map.Item.Source"
      },
      "ItemProcessor": {
        "ProcessorConfig": {
          "Mode": "INLINE"
        },
        "StartAt": "TestPass",
        "States": {
          "TestPass": {
            "Type": "Pass",
            "End": true
          }
        }
      },
      "End": true
    }
  }
}
```

对于 JSONata，可以从`$states.context`变量访问其他 Map 状态上下文信息：

```
{
  "StartAt": "ExampleMapState",
  "States": {
    "ExampleMapState": {
      "Type": "Map",
      "ItemSelector": {
        "ContextIndex": "{% $states.context.Map.Item.Index %}",
        "ContextValue": "{% $states.context.Map.Item.Value %}",
        "ContextSource": "{% $states.context.Map.Item.Source %}"
      },
      "ItemProcessor": {
        "ProcessorConfig": {
          "Mode": "INLINE"
        },
        "StartAt": "TestPass",
        "States": {
          "TestPass": {
            "Type": "Pass",
            "End": true
          }
        }
      },
      "End": true
    }
  }
}
```



如果使用以下输入执行前一状态机，则将 `Index` 和 `Value` 插入到输出中。

```
[
  {
    "who": "bob"
  },
  {
    "who": "meg"
  },
  {
    "who": "joe"
  }
]
```

执行的输出返回三次迭代中每次迭代的 `Index` 和 `Value` 项的值，如下所示：

```
[
  {
    "ContextIndex": 0,
    "ContextValue": {
      "who": "bob"
    },
    "ContextSource" : "STATE_DATA" 
  },
  {
    "ContextIndex": 1,
    "ContextValue": {
      "who": "meg"
    },
    "ContextSource" : "STATE_DATA" 
  },
  {
    
    "ContextIndex": 2,
    "ContextValue": {
      "who": "joe"
    },
    "ContextSource" : "STATE_DATA" 
  }
]
```

请注意，`$states.context.Map.Item.Source` 将是以下项之一：
+ 对于状态输入，该值将为：`STATE_DATA`
+ 对于 `Amazon S3 LIST_OBJECTS_V2` (`Transformation=NONE`)，该值将显示存储桶的 S3 URI。例如：`S3://bucket-name`。
+ 对于所有其他输入类型，该值将为 Amazon S3 URI。例如：`S3://bucket-name/object-key`。