使用Ruby SDK从SNS接收消息时使用AWS SQS JSON格式

使用Ruby SDK从SNS接收消息时使用AWS SQS JSON格式,ruby,json,amazon-web-services,amazon-sqs,amazon-sns,Ruby,Json,Amazon Web Services,Amazon Sqs,Amazon Sns,我有一个订阅SNS主题的SQS队列。当我发布新的主题通知时,我使用以下代码(在Sinatra应用程序中): 当我的队列侦听器接收到此通知时,相应哈希的消息部分如下所示: "Message"=>"{\"announcement\":{\"first_name\":\"Eve\",\"last_name\":\"Salt\",\"loc_code\":\"Location\",\"note\":\"test\"}}" 在我的队列侦听器中,我想使用此哈希,但当我尝试使用 JSON.parse(

我有一个订阅SNS主题的SQS队列。当我发布新的主题通知时,我使用以下代码(在Sinatra应用程序中):

当我的队列侦听器接收到此通知时,相应哈希的消息部分如下所示:

"Message"=>"{\"announcement\":{\"first_name\":\"Eve\",\"last_name\":\"Salt\",\"loc_code\":\"Location\",\"note\":\"test\"}}"
在我的队列侦听器中,我想使用此哈希,但当我尝试使用

JSON.parse(result['Message'])
由于转义的双引号,我得到了一个意外的令牌错误。关于如何解决这个问题有什么建议吗?我是否以JSON格式正确发送通知?如何让sns/sqs不逃避双引号?

找到了答案


问题是我获取JSON的方式。我需要使用
JSON.load(result['Message'])
,而不是
JSON.parse(…)

SNS publish方法在发布消息之前实际使用转义字符。 这是医生

特定于JSON的约束:

JSON对象中对应于支持的传输协议的键必须具有简单的JSON字符串值。 在传出消息中使用这些值之前,将对其进行分析(取消扫描)。 出站通知是JSON编码的(这意味着字符将被重新设置为发送格式)。 值的最小长度为0(允许使用空字符串“”。 值的最大长度由整个消息大小限定(因此,包括多个协议可能会限制消息大小)。 非字符串值将导致忽略键。 不符合支持的传输协议的密钥将被忽略。 不允许使用重复的密钥。 未能解析或验证消息中的任何键或值将导致发布调用返回错误(无部分传递)

因此,在java中,我们使用下面的指令获取json消息。这将从传入消息中删除转义字符

无效句柄(消息){


如果您不想处理消费者必须从输入消息中删除转义字符,那么您也可以考虑在主题订阅上打开原始消息传递。

请参考AWS中的以下文档:


你帮我省去了很多烦恼!
JSON.parse(result['Message'])
    **String serializedMessage = SNSMessage.fromJson(message).getMessage();**