JSON 使用 Boto 3 发布 SNS 消息编码错误

JSON encoding error publishing SNS message with Boto 3

我正在尝试向 Boto 3 中的 Amazon SNS 主题发送一条简单的 JSON 消息。但是,我一直在消息的标签中收到 _jsonparsefailure,并且我只收到默认值。这是我的代码:

    mess = {'default': 'default', 'this': 'that'}
    jmess = json.JSONEncoder().encode(mess)

    response = self.boto_client.publish(
        TopicArn = self.TopicArn,
        MessageStructure = 'json',
        Message = jmess
    )

我也试过json.dumps(),结果一样。

    mess = {'default': 'default', 'this': 'that'}
    jmess = json.dumps(mess)

    response = self.boto_client.publish(
        TopicArn = self.TopicArn,
        MessageStructure = 'json',
        Message = jmess
    )

我似乎遵循了文档设置的所有准则,并且在我 运行 脚本时没有遇到异常。有订阅主题的SQS队列,我是直接从控制台拉取结果数据

原来消息需要看起来像这样:

json.dumps({"default": "my default", "sqs": json.dumps({"this": "that"})})

亚马逊在这方面的文档很糟糕。

如果您将 SQS 队列设置为只接收原始消息,您也可以删除 MessageStructure='json' 并只发送 json.dumps({'this':'that'})。这只需通过控制台即可完成。

我是这样修复的:

message = {"record_id": "my_id", "name": "value"}
json_message = json.dumps({"default":json.dumps(message)})
sns_client.publish("topic_arn", Subject="test", MessageStructure="json", Message=json_message)

SNS 期望“默认”作为包含要发布的消息的键。

在 Boto 3 中(我使用的是 v1.4.7)这是格式:

sns.publish(TopicArn="topic_arn", Message=json.dumps({"this": "that"},ensure_ascii=False))

不需要协议定义,即“默认”,除非您为每个协议提供不同的结构,即 JSON 用于 Lambda 和 HTML 用于电子邮件.