我有一个订阅了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不能避开双引号?
答案 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