为什么我的任务的 JSON 输出被 AWS Step Functions 转义?
Why is the JSON output of my task being escaped by AWS Step Functions?
我有一个 Lambda 函数,它 运行 在步进函数中。
Lambda 函数 returns 一个 JSON 字符串作为输出。
当我在本地调试函数时,我看到 JSON 是有效的,但是当我 运行 step 函数并在我的函数之后进入下一步时,我可以看到我所有的"
已经转成\"
而且我的JSON开头和结尾都有一个"
。
因此,当我调试我的函数时,一个 JSON 对象如下所示:
{"test":60,"test2":"30000","test3":"result1"}
作为我的 lambda 之后步骤的输入,最终看起来像下面这样:
"{\"test\":60,\"test2\":\"30000\",\"test3\":\"result1\"}"
为什么我的有效 JSON 对象最终被转义?
如何防止这种情况发生?
The Lambda function returns a JSON string as output.
这正是 您的 JSON 被转义的原因 - 您 return 将对象作为 JSON 字符串 例如使用 JSON.stringify
而不是 JSON object.
解决此问题的最简单方法是仅 return 对象而不将输出转换为 JSON 字符串。这样一来,它就不会 不会 被转义并且会被 return 编辑,正如您所期望的那样,作为一个对象。
但是,如果出于某种原因它必须保留为 JSON 字符串,您可以使用 States.StringToJson(...)
intrinsic function 来使用 ResultSelector
属性 你的任务。
例如,如果您的输出是:
{
"Payload": "{\"test\":60,\"test2\":\"30000\",\"test3\":\"result1\"}",
...
}
为了能够在将输出传递给下一个任务之前取消转义,请将任务的 ResultSelector
设置为:
"ResultSelector": {
"Payload.$":"States.StringToJson($.Payload)"
}
或者如果使用 Workflow Studio,单击任务,检查 输出 > 使用 ResultSelector 转换结果 - 可选复选框并在文本框中填写上面的ResultSelector
对象:
无论哪种方式,您的任务定义的最终结果应该如下所示:
{
...
"States": {
"Lambda Invoke": {
"Type": "Task",
...
"ResultSelector": {
"Payload.$":"States.StringToJson($.Payload)"
}
}
}
}
输出将如您所愿:
{
"Payload": {
"test": 60,
"test2": "30000",
"test3": "result1"
}
}
虽然@Ermiya Eskandary 的回答是完全正确的,但您还有更多选项可以使用或不使用 ResultSelector(如果它是字符串化的 json,那么您几乎可以但是必须使用 ResultSelector 作为答案提到的)属性。结果路径和输出路径。
如果在这个 Lambda 之后你不需要传入事件来处理其他任何事情,那么让你的 lambda return 一个 Json 类对象(即:如果在 python,return一个字典)
在您的状态机定义中,然后在您的 Lambda 任务中包含两个属性
OutputPath:"$.SomeKey",
ResultPath:"$.SomeKey"
两者的 SomeKey 必须相同。
这两行在任务属性中的意思是 (ResultPath) "Put the output of this lambda in the event under the key 'SomeKey'" and then (OutputPath) "only send this key on to下一个任务
如果您仍然需要来自 Input 的数据,您可以单独使用 ResultPath:
,这会将 Lambda 的输出放在分配的键下,并将其附加到 InputEvent。
我有一个 Lambda 函数,它 运行 在步进函数中。
Lambda 函数 returns 一个 JSON 字符串作为输出。
当我在本地调试函数时,我看到 JSON 是有效的,但是当我 运行 step 函数并在我的函数之后进入下一步时,我可以看到我所有的"
已经转成\"
而且我的JSON开头和结尾都有一个"
。
因此,当我调试我的函数时,一个 JSON 对象如下所示:
{"test":60,"test2":"30000","test3":"result1"}
作为我的 lambda 之后步骤的输入,最终看起来像下面这样:
"{\"test\":60,\"test2\":\"30000\",\"test3\":\"result1\"}"
为什么我的有效 JSON 对象最终被转义?
如何防止这种情况发生?
The Lambda function returns a JSON string as output.
这正是 您的 JSON 被转义的原因 - 您 return 将对象作为 JSON 字符串 例如使用 JSON.stringify
而不是 JSON object.
解决此问题的最简单方法是仅 return 对象而不将输出转换为 JSON 字符串。这样一来,它就不会 不会 被转义并且会被 return 编辑,正如您所期望的那样,作为一个对象。
但是,如果出于某种原因它必须保留为 JSON 字符串,您可以使用 States.StringToJson(...)
intrinsic function 来使用 ResultSelector
属性 你的任务。
例如,如果您的输出是:
{
"Payload": "{\"test\":60,\"test2\":\"30000\",\"test3\":\"result1\"}",
...
}
为了能够在将输出传递给下一个任务之前取消转义,请将任务的 ResultSelector
设置为:
"ResultSelector": {
"Payload.$":"States.StringToJson($.Payload)"
}
或者如果使用 Workflow Studio,单击任务,检查 输出 > 使用 ResultSelector 转换结果 - 可选复选框并在文本框中填写上面的ResultSelector
对象:
无论哪种方式,您的任务定义的最终结果应该如下所示:
{
...
"States": {
"Lambda Invoke": {
"Type": "Task",
...
"ResultSelector": {
"Payload.$":"States.StringToJson($.Payload)"
}
}
}
}
输出将如您所愿:
{
"Payload": {
"test": 60,
"test2": "30000",
"test3": "result1"
}
}
虽然@Ermiya Eskandary 的回答是完全正确的,但您还有更多选项可以使用或不使用 ResultSelector(如果它是字符串化的 json,那么您几乎可以但是必须使用 ResultSelector 作为答案提到的)属性。结果路径和输出路径。
如果在这个 Lambda 之后你不需要传入事件来处理其他任何事情,那么让你的 lambda return 一个 Json 类对象(即:如果在 python,return一个字典)
在您的状态机定义中,然后在您的 Lambda 任务中包含两个属性
OutputPath:"$.SomeKey",
ResultPath:"$.SomeKey"
两者的 SomeKey 必须相同。
这两行在任务属性中的意思是 (ResultPath) "Put the output of this lambda in the event under the key 'SomeKey'" and then (OutputPath) "only send this key on to下一个任务
如果您仍然需要来自 Input 的数据,您可以单独使用 ResultPath:
,这会将 Lambda 的输出放在分配的键下,并将其附加到 InputEvent。