使用Ruby SDK从SNS接收消息时使用AWS SQS JSON格式
我有一个订阅了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 /平方不逃避双引号?
找到答案。
问题是我得到JSON的方式。 我需要使用JSON.load(result['Message'])
,而不是JSON.parse(...)
。
在发布消息之前,SNS发布方法实际上会使用转义字符。 以下是文档http://docs.aws.amazon.com/sns/latest/api/API_Publish.html
JSON特定的约束:
JSON对象中对应于支持的传输协议的键必须具有简单的JSON字符串值。 在传出消息中使用这些值之前,这些值将被解析(未转义)。 出站通知是JSON编码的(这意味着角色将被重新发送)。 值的最小长度为0(允许使用空字符串“”)。 值的最大长度由整个消息大小限制(因此,包括多个协议可能会限制消息大小)。 非字符串值将导致该键被忽略。 不符合支持的传输协议的密钥将被忽略。 重复密钥是不允许的。 未能解析或验证消息中的任何键或值将导致Publish调用返回错误(无部分传送)。
所以在java中,我们使用下面的指令获得json消息。 这会从传入消息中删除转义字符。
无效句柄(消息消息){
**String serializedMessage = SNSMessage.fromJson(message).getMessage();**
}
如果您不想处理消费者必须从传入消息中移除转义字符,您也可以考虑在主题订阅上启用原始消息传递。
请参阅AWS中的以下文档:
http://docs.aws.amazon.com/sns/latest/dg/large-payload-raw-message.html
链接地址: http://www.djcxy.com/p/32197.html上一篇: AWS SQS JSON format when receiving message from SNS with Ruby SDK