【问题标题】:python use variable in escaped JSON stringpython在转义的JSON字符串中使用变量
【发布时间】:2021-10-04 14:44:38
【问题描述】:

我正在使用 AWS SES send_templated_email 方法。 它使用了一个名为 TemplateData 的参数 TemplateData – 包含键值对的转义 JSON 字符串。键对应于模板中的变量(例如,{{name}})。这些值表示替换电子邮件中变量的内容。

如果我使用硬编码,像这样:

TemplateData="""{\"quarter_num\":\"Q2\",
                  \"year\":\"2021\",
                }"""

这行得通

但如果我想在该字符串中使用变量,例如:

TemplateData="""{\"quarter_num\":\"{}\",
                  \"year\":\"{}\",
                    }""".format("Q2", "2021")

这行不通。我认为这是一个逃避问题,但我不知道如何正确地做到这一点。 这是我收到的错误消息:

[ERROR] KeyError: '"quarter_num"'
Traceback (most recent call last):
  File "/var/task/email_reports.py", line 35, in email_users
    }""".format("Q2", "2021")

当我使用硬编码字符串时,这没有任何问题。

【问题讨论】:

  • “这行不通”当您说“行不通”时,请始终准确告诉我们这是什么意思。不要让人猜测
  • @juanpa.arrivillaga 错误是 boto3 错误,基本上说我没有为该参数使用正确的字符串
  • 再次,请确切地告诉我们错误是什么。
  • @juanpa.arrivillaga 我添加了收到的错误消息。

标签: python json string escaping


【解决方案1】:

不要尝试将其写为带有插值变量的字符串。那就是疯狂。编写 Python dict,并使用 json.dumps() 将其转换为字符串。

TemplateData = json.dumps({"quarter_num": "Q2",
                           "year": "2021",
                          })

那么如何用变量替换一些数据就很明显了。例如:

TemplateData = json.dumps({"quarter_num": "Q%s" % quarter,
                           "year": year,
                          })

这样,您的 IDE 可以帮助您编写字典,而 Python 本身会检查您的语法,如果所有内容都在一个又大又丑的字符串中,就不会发生这种情况。

【讨论】:

  • 我刚试过这个。不知何故,这也不起作用。我想这与 AWS 如何设计他们的 API 有关?它在这里说参数需要是一个包含键值对的转义 JSON 字符串。 docs.aws.amazon.com/ses/latest/DeveloperGuide/…
  • @Lykosz 再次“它不工作”不是一个充分的问题描述
  • @kindall 对不起,我的错。我认为这实际上解决了这个问题。 lambda 只是没有正确部署。
【解决方案2】:

你不需要在多行字符串中转义引号:

In [5]: TemplateData=f"""{{"quarter_num":"{"Q2"}",                                                                         
...:                       "year":"{2021}"}}"""   
Out[5]: '{"quarter_num":"Q2",\n                  "year":"2021"}'                                                                  

在这个例子中我使用了 f-string,你只需要用双大括号来转义它们

【讨论】:

  • 硬编码方式一直有效。我需要的是在该字符串中添加变量。
  • 这正是我正在做的:格式化字符串以将“Q2”和“2021”放在正确的位置。您可以用任何表达式替换它们,它们将被插值
  • 对不起,你是对的。我一开始没明白。我刚试过,这行得通。
猜你喜欢
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
  • 2018-12-17
  • 2022-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多