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

时间:2014-05-26 04:44:21

标签: ruby json amazon-web-services amazon-sqs amazon-sns

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

jsonMessage =  {
    "announcement" => {     
        "first_name" => results['first_name'][:s],  
                        "last_name" => results['last_name'][:s],
                        "loc_code" => results['location'][:s], 
                        "note" => params['note_content']
    }
}

msgid = @announcments_topic.publish(jsonMessage.to_json, 
                                    {subject: "Note Created",
                                     message_structure: 'json' })

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

"Message"=>"{\"announcement\":{\"first_name\":\"Eve\",\"last_name\":\"Salt\",\"loc_code\":\"Location\",\"note\":\"test\"}}"

在我的队列侦听器中,我想使用此哈希,但是当我尝试使用

JSON.parse(result['Message'])

由于双引号转义,我收到意外的令牌错误。有关如何解决此问题的任何建议?我没有正确发送JSON通知吗?如何让sns / sqs不能避开双引号?

3 个答案:

答案 0 :(得分:3)

找到答案。

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

答案 1 :(得分:1)

SNS发布方法实际上在发布消息之前会转义转义字符。 这是文档http://docs.aws.amazon.com/sns/latest/api/API_Publish.html

特定于JSON的约束:

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

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

void handle(消息消息){

    **String serializedMessage = SNSMessage.fromJson(message).getMessage();**

}

答案 2 :(得分:0)

如果您不想处理必须从传入邮件中删除转义字符的消费者,您也可以考虑在主题订阅上启用原始邮件传递。

请参阅AWS中的以下文档:

http://docs.aws.amazon.com/sns/latest/dg/large-payload-raw-message.html