繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM