[英]AWS SQS JSON format when receiving message from SNS with Ruby SDK
我有一个已订阅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部分如下所示:
"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的发布方法实际上是在发布消息之前添加转义字符。 这是文档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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.